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. 遞歸法
思路:
- 遞歸終止條件爲當前根節點爲 null
- 使用遞歸依次將左右子樹都進行翻轉
- 最後將翻轉後的結果交換位置添加到左(右)子樹中即可
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. 迭代法
思路:
- 創建一個隊列,並將根節點放入隊列中
- 只要隊列不爲 null,取出隊首元素,交換其左右子樹
- 再將當前節點的左右子樹添加到隊列中即可
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