LeetCode-099-恢復二叉搜尋樹

雄獅虎豹發表於2021-11-18

恢復二叉搜尋樹

題目描述:給你二叉搜尋樹的根節點 root ,該樹中的兩個節點被錯誤地交換。請在不改變其結構的情況下,恢復這棵樹。

進階:使用 O(n) 空間複雜度的解法很容易實現。你能想出一個只使用常數空間的解決方案嗎?

示例說明請見LeetCode官網。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解法一:遞迴法
  • 首先,通過中序遍歷得到二叉搜尋樹的所有節點allNodes,正常情況下,如果沒有節點被錯誤的交換,allNodes所有節點應該是按升序排列,所以要找出被交換的2個節點;
  • 從後往前遍歷allNodes,找到第一個值比前面的值小的節點,即為錯誤的第一個節點high;
  • high-1開始往前遍歷allNodes,找到第一個值比high節點小的節點low,low+1位置的節點即為錯誤的第二個節點;
  • 交換low和high2個節點的值,即可恢復這棵樹。
import java.util.ArrayList;
import java.util.List;

public class LeetCode_099 {
    public static void recoverTree(TreeNode root) {
        List<TreeNode> allNodes = inOrder(root);
        int high = -1, low = -1;
        for (int i = allNodes.size() - 1; i >= 1; i--) {
            // 找到上面的要交換的節點
            if (allNodes.get(i).val < allNodes.get(i - 1).val) {
                high = i;
                break;
            }

        }

        // 找到下面要交換的節點
        for (low = high - 1; low >= 0; low--) {
            if (allNodes.get(low).val < allNodes.get(high).val) {
                break;
            }
        }
        low++;
        int temp = allNodes.get(low).val;
        allNodes.get(low).val = allNodes.get(high).val;
        allNodes.get(high).val = temp;
    }

    /**
     * 中序遍歷
     *
     * @param root
     * @return
     */
    private static List<TreeNode> inOrder(TreeNode root) {
        List<TreeNode> nodes = new ArrayList<>();
        if (root != null) {
            nodes.addAll(inOrder(root.left));
            nodes.add(root);
            nodes.addAll(inOrder(root.right));
        }
        return nodes;
    }

    public static void main(String[] args) {
        TreeNode root = new TreeNode(3);
        root.left = new TreeNode(1);
        root.right = new TreeNode(4);
        root.right.left = new TreeNode(2);

        recoverTree(root);
        System.out.println("恢復之前");
        root.print();
        System.out.println();
        System.out.println("恢復之後");
        root.print();
    }
}
【每日寄語】 感謝不離不棄的你,讓我知道仍有人愛我。感謝你的支援,不論今天有多挫折,我仍會勇敢地活下去。

相關文章