二叉树篇--代码随想录算法训练营第十四天|翻转二叉树,对称二叉树,二叉树的最大深度,二叉树的最小深度

翻转二叉树

题目链接:. - 扣(LeetCode)

讲解视频:听说一位巨佬面Google被拒了,因为没写出翻转二叉树 | LeetCode:226.翻转二叉树

题目描述:

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

示例 1:

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

解题思路:

中操作:交换左右子树

解题方法:

  1. 自上而下交换左右子树-->前序遍历
  2. 自下而上交换左右子树-->后序遍历

代码:

 后序遍历代码:

class Solution {
public:
    void recursion(TreeNode* root)
    {
        if(root == nullptr) return;
        invertTree(root->left);
        invertTree(root->right);
        swap(root->left,root->right);
    }

    TreeNode* invertTree(TreeNode* root) {
        recursion(root);
        return root;
    }
};

前序遍历代码:

class Solution {
public:
    void recursion(TreeNode* root)
    {
        if(root == nullptr) return;
        swap(root->left,root->right);
        invertTree(root->left);
        invertTree(root->right);
    }

    TreeNode* invertTree(TreeNode* root) {
        recursion(root);
        return root;
    }
};

注意 

中序遍历不能直接用此方法。如图所示,通过此方法发现原先右子树没有反转操作,原先左子树被反转两次

对称二叉树

题目链接:. - 力扣(LeetCode)

讲解视频:同时操作两个二叉树 | LeetCode:101. 对称二叉树

题目描述:

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

解题思路:

左子树的后序遍历

左操作:使用左节点的左子树与右节点的右子树进行操作

右操作:使用左节点的右子树与右节点的左子树进行操作

中操作:汇集左右操作的结果

代码:

class Solution {
public:
    bool compare(TreeNode* left, TreeNode* right)
    {
        if(!left && right) return false;
        if(left && !right) return false;
        if(!left && !right) return true;
        if(left->val != right->val) return false;
        bool outside = compare(left->left,right->right);
        bool inside = compare(left->right, right->left);
        return outside && inside;
    }

    bool isSymmetric(TreeNode* root) {
        if(root == nullptr) return true;
        return compare(root->left,root->right);
    }
};

 

二叉树的最大深度

题目链接:. - 力扣(LeetCode)

讲解视频:二叉树的高度和深度有啥区别?究竟用什么遍历顺序?很多录友搞不懂 | 104.二叉树的最大深度

题目描述:

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:3

高度与深度关系 

高度:节点到叶子节点的距离

深度:节点到根节点距离 

解题思路:

结论:树的最大高度=树的最大深度

使用后序遍历通过求解树的最大高度进而得到数的最大深度

中操作:保存左右操作中得到的最大高度

代码:

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root == nullptr) return 0;
        int leftheight = maxDepth(root->left);
        int rightheight = maxDepth(root->right);
        return 1+ (leftheight > rightheight ? leftheight : rightheight);
    }
};

二叉树的最小深度

题目链接:. - 力扣(LeetCode)

讲解视频:看起来好像做过,一写就错! | LeetCode:111.二叉树的最小深度

题目描述:

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:2

解题思路:

 最小深度与最大深度解题思路类似,不同点在于最小深度中会增加两个判断条件:

  1. 左子树为空,右子树不为空
  2. 左子树不为空,右子树为空

代码:

class Solution {
public:
    int minDepth(TreeNode* root) {
        if(root == nullptr) return 0;
        int leftheight = minDepth(root->left);
        int rightheight = minDepth(root->right);
        int result;
        if(!leftheight && rightheight) result = rightheight+1;
        else if(leftheight && !rightheight) result = leftheight+1;
        else result = 1 + (rightheight > leftheight ? leftheight : rightheight);

        return result;
    }
};

  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值