力扣226. 翻转二叉树

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/

上一篇:(c语言)Leetcode 226.翻转二叉树


下一篇:LeetCode 226. Invert Binary Tree