手撸二叉树之翻转二叉树

举报
HelloWorld杰少 发表于 2022/09/29 10:32:56 2022/09/29
【摘要】 题目翻转一棵二叉树。示例:输入: 4 / \ 2 7 / \ / \1 3 6 9输出: 4 / \ 7 2 / \ / \9 6 3 1 解题思路根据题意,翻转二叉树的意思就是把每个节点的左右孩子翻转,这样就可以达到整体的翻转效果了。所以,我们可以利用先序遍历,中序遍历,后续遍历这三种方法中的一种来实现翻转,思路如下...

题目

翻转一棵二叉树。

示例:

输入:

    4
   /   \
  2     7
 / \   / \
1   3 6   9

输出:

    4
   /   \
  7     2
 / \   / \
9   6 3   1

解题思路

根据题意,翻转二叉树的意思就是把每个节点的左右孩子翻转,这样就可以达到整体的翻转效果了。

所以,我们可以利用先序遍历,中序遍历,后续遍历这三种方法中的一种来实现翻转,思路如下:

递归三部曲:

  1. 确定递归函数的参数和返回值:递归函数的参数为输入的节点,由于题目中需要返回 TreeNode 类型的返回值,所以递归函数的返回值为 TreeNode;
  2. 确定终止条件:当 root == null 时,终止递归,返回 root;
  3. 确定单层递归逻辑: 如果是先序遍历,则先交换左右孩子节点,然后翻转左子树,再翻转右子树;如果是中序遍历,则先翻转左子树,再交换左右孩子节点,最后翻转右子树;如果是后序遍历,则先翻转左子树,再翻转右子树,最后交换左右孩子节点;

代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
 
 
// 利用前序遍历
class Solution {
        // 先序遍历--从顶向下交换
        public TreeNode invertTree(TreeNode root) {
            if (root == null) return null;
            // 保存右子树
            TreeNode rightTree = root.right;
            // 交换左右子树的位置
            root.right = invertTree(root.left);
            root.left = invertTree(rightTree);
            return root;
        }
    }

// 利用中序遍历
class Solution {
    public TreeNode invertTree(TreeNode root) {
            if (root == null) return null;
            invertTree(root.left); // 递归找到左节点
            TreeNode rightNode= root.right; // 保存右节点
            root.right = root.left;
            root.left = rightNode;
            // 递归找到右节点 继续交换 : 因为此时左右节点已经交换了,所以此时的右节点为root.left
            invertTree(root.left); 
    }
}

// 利用后序遍历
 class Solution {
        public TreeNode invertTree(TreeNode root) {
            // 后序遍历
            if (root == null) return null;
            TreeNode leftNode = invertTree(root.left);
            TreeNode rightNode = invertTree(root.right);
            root.right = leftNode;
            root.left = rightNode;
            return root;
        }
    }

最后

复杂度分析:

  • 时间复杂度:O(N),其中 N 为二叉树节点的数目。
  • 空间复杂度:O(N)。使用的空间由递归栈的深度决定,它等于当前节点在二叉树中的高度
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。