1. 程式人生 > 其它 >力扣226. 翻轉二叉樹

力扣226. 翻轉二叉樹

技術標籤:二叉樹佇列演算法資料結構面試

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/