力扣226. 翻轉二叉樹
阿新 • • 發佈:2021-02-09
226. 翻轉二叉樹
翻轉一棵二叉樹。
示例:
輸入:
輸出:
思路一:遞迴
直接進行遞迴,交換左右孩子後,對左右孩子分別遞迴交換左右孩子
1 class Solution { 2 public TreeNode invertTree(TreeNode root) { 3 // 如果根節點為null, 直接返回null 4 if(root == null){ 5 return null; 6 } 7 // 交換root的左右子樹 8 TreeNode temp = root.left; 9 root.left = root.right; 10 root.right = temp; 11 // 遞迴交換左右子樹 12 invertTree(root.left); 13 invertTree(root.right); 14 return root; 15 } 16 }
複雜度分析
時間複雜度:需要對每個結點進行一次遞迴,所以時間複雜度為O(n), n等於結點個數
空間複雜度:每次遞迴都需要一個臨時變數temp, 但是這是常數級別的,最大遞迴深度為樹的高度,所以複雜度為O(h), 由於樹的平衡性未知,所以空間複雜度為O(n) 而不是O(logn)
思路二:BFS
利用BFS遍歷結點,在每次彈出隊首結點時,將結點的左右孩子進行交換,然後入隊左右孩子
1 class Solution { 2 public TreeNode invertTree(TreeNode root) { 3 // 利用BFS遍歷結點,在每次彈出隊首結點時,將結點的左右孩子進行交換,然後入隊左右孩子 4 Queue<TreeNode> queue = new LinkedList<TreeNode>(); 5 if(root == null) 6 return null; 7 queue.offer(root); 8 while(!queue.isEmpty()){ 9 TreeNode top = queue.poll(); 10 TreeNode temp = top.left; 11 top.left = top.right; 12 top.right = temp; 13 if(top.left != null) 14 queue.offer(top.left); 15 if(top.right != null) 16 queue.offer(top.right); 17 } 18 return root; 19 } 20 }
複雜度分析
時間複雜度:同思路一一樣,都是對樹的每個結點進行了一次訪問,所以時間複雜度為O(n)
空間複雜度:佇列中只會儲存一層的結點,所以最壞情況下,對於一顆完整二叉樹來說,葉子節點那一層擁有⌈n/2⌉=O(n)個節點。
思路來源:
https://leetcode-cn.com/problems/invert-binary-tree/solution/fan-zhuan-er-cha-shu-by-leetcode/