力扣226. 翻转二叉树

86 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情

力扣226. 翻转二叉树

一、题目描述:

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

img

输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 示例 2:

img

输入:root = [2,1,3] 输出:[2,3,1] 示例 3:

输入:root = [] 输出:[]

提示:

树中节点数目范围在 [0, 100] 内 -100 <= Node.val <= 100

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/in… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

  1. 这道题考察了什么思想?你的思路是什么?

    这是一道有关二叉树的题目,我们需要从根节点遍历到叶子节点,然后从叶子节点开始翻转,一步一步向上,直到整棵树完成翻转。

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    不是一次通过的,刚开始的写法有大问题~

    不献丑了,就是先翻转,然后再向下,似乎思考起来也没什么问题,但是没有成功实现~

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

    大佬用BFS进行层序遍历,在遍历的过程中进行翻转~其实这个办法很好啊!

         public TreeNode invertTree(TreeNode root) {
             if (root == null)
                 return root;
             Queue<TreeNode> queue = new LinkedList<>();
             queue.add(root);//相当于把数据加入到队列尾部
             while (!queue.isEmpty()) {
                 //poll方法相当于移除队列头部的元素
                 TreeNode node = queue.poll();
                 //先交换子节点
                 TreeNode left = node.left;
                 node.left = node.right;
                 node.right = left;
     ​
                 if (node.left != null)
                     queue.add(node.left);
                 if (node.right != null)
                     queue.add(node.right);
             }
             return root;
         }
     ​
     作者:sdwwld
     链接:https://leetcode-cn.com/problems/invert-binary-tree/solution/di-gui-bfshe-dfsduo-chong-fang-shi-jie-jue-quan-bu/
     来源:力扣(LeetCode)
     著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

三、AC 代码:

 /**
  * Definition for a binary tree node.
  * struct TreeNode {
  *     int val;
  *     struct TreeNode *left;
  *     struct TreeNode *right;
  * };
  */
 ​
 struct TreeNode* invertTree(struct TreeNode* root) {
     if (root == NULL) {
         return NULL;
     }
     struct TreeNode* left = invertTree(root->left);
     struct TreeNode* right = invertTree(root->right);
     root->left = right;
     root->right = left;
     return root;
 }
 ​

image.png

四、总结:

其实该题核心就是考察二叉树的遍历,对于二叉树的几种遍历方法要掌握~