LeetCode 226. 翻轉二叉樹

226. 翻轉二叉樹

翻轉一棵二叉樹。

示例:
輸入:

     4
   /   \
  2     7
 / \   / \
1   3 6   9
輸出:

     4
   /   \
  7     2
 / \   / \
9   6 3   1
備註:
  • 谷歌:我們90%的工程師使用您編寫的軟件(Homebrew),但是您卻無法在面試時在白板上寫出翻轉二叉樹這道題,這太糟糕了。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/invert-binary-tree/
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。


  • 創建二叉搜索樹

public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
            val = x;
        }
    }
  • 1. 遞歸法

思路:

  1. 遞歸終止條件爲當前根節點爲 null
  2. 使用遞歸依次將左右子樹都進行翻轉
  3. 最後將翻轉後的結果交換位置添加到左(右)子樹中即可
public TreeNode invertTree(TreeNode root) {
        if (root == null) return null;
        TreeNode leftNode = root.left;
        TreeNode rightNode = root.right;
        root.left = invertTree(rightNode);
        root.right = invertTree(leftNode);
        return root;
    }

複雜度分析:

  • 時間複雜度:O(n), 需要遍歷每個元素

  • 空間複雜度:O(n),使用了遞歸,在最壞情況下棧內需要存放 O(h) 個方法調用,其中 h 是樹的高度。可得出空間複雜度爲 O(n)。

  • 2. 迭代法

思路:

  1. 創建一個隊列,並將根節點放入隊列中
  2. 只要隊列不爲 null,取出隊首元素,交換其左右子樹
  3. 再將當前節點的左右子樹添加到隊列中即可
public TreeNode invertTree(TreeNode root) {
        if (root == null) return null;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            TreeNode cur = queue.poll();
            TreeNode temp = cur.left;
            cur.left = cur.right;
            cur.right = temp;
            if (cur.left != null) queue.add(cur.left);
            if (cur.right != null) queue.add(cur.right);
        }
        return root;
    }

複雜度分析:

  • 時間複雜度:O(n), 需要遍歷每個元素將其添加到隊列
  • 空間複雜度:O(n), 隊列中添加每個元素所佔用的空間

  • 源碼

  • 我會每天更新新的算法,並儘可能嘗試不同解法,如果發現問題請指正
  • Github
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章