代码随想录算法训练营第14天 |LeetCode226.翻转二叉树 LeetCode101. 对称二叉树 LeetCode104.二叉树的最大深度 LeetCode111.二叉树的最小深度

代码随想录算法训练营

Day1 代码随想录算法训练营第14天 |LeetCode226.翻转二叉树 LeetCode101. 对称二叉树 LeetCode104.二叉树的最大深度 LeetCode111.二叉树的最小深度



前言

LeetCode226.翻转二叉树

讲解文档
视频讲解

LeetCode101. 对称二叉树

讲解文档
视频讲解

LeetCode104.二叉树的最大深度

讲解文档
视频讲解

LeetCode111.二叉树的最小深度

讲解文档
视频讲解


一、LeetCode226.翻转二叉树

1.题目链接

LeetCode226.翻转二叉树

2.思路

反转二叉树本质上是将每个节点的左右子节点互换
需要先遍历并互换左右子节点
遍历方法不限

3.题解

(1)递归遍历

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if(root==NULL)return root;
        TreeNode *p=root->right;
        root->right=root->left;
        root->left=p;
        invertTree(root->left);
        invertTree(root->right);
        return root;
    }
};

(2)栈遍历(前序)

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if (root == NULL)
            return root;
        stack<TreeNode*> st;
        st.push(root);
        while (!st.empty()) {
            TreeNode* p = st.top();
            st.pop();
            TreeNode* n = p->left;
            p->left = p->right;
            p->right = n;
            if (p->left != NULL)
                st.push(p->left);
            if (p->right != NULL)
                st.push(p->right);
        }
        return root;
    }
};

二、LeetCode101. 对称二叉树

1.题目链接

LeetCode101. 对称二叉树

2.思路

(1)对称性:左右子树是否对称,等价于两个子树内层是否对应相等,外层是否对应相等
(2)递归思路
1)确定参数和返回值
2)终止条件:
左右节点均空:true
左右节点一个空一个不空:false
左右节点值不相等:false
左右节点值相等:递归
3)递归:
内层是否对称:inner=compare(左节点右子节点,右节点左子结点)
外层是否对称:outer=compare(左节点左子节点,右节点右子结点)

3.题解

class Solution {
public:
    bool compare(TreeNode* l, TreeNode* r) {
        if (l == NULL && r != NULL)
            return false;
        else if (l != NULL && r == NULL)
            return false;
        else if (l == NULL && r == NULL)
            return true;
        else if (l->val != r->val)
            return false;
        else {
            bool inner = compare(l->right, r->left);
            bool outer = compare(l->left, r->right);
            return inner && outer;
        }
    }
    bool isSymmetric(TreeNode* root) {
        return compare(root->left, root->right);
    }
};

三、LeetCode104.二叉树的最大深度

1.题目链接

LeetCode104.二叉树的最大深度

2.思路

(1)基础概念
1)叶子结点:没有子节点的节点
2)深度:根节点到某个节点之间最大的边数或者结点数
高度:某节点到叶子结点之间最大的边数或者节点数
(2)分别对左子树和右子树进行递归,求出左子树中root的最大高度,右子树中root的最大高度最后,结果是二者的最大值

3.题解

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root==NULL)return 0;
        int l=maxDepth(root->left)+1;
        int r=maxDepth(root->right)+1;
        return max(l,r);
    }
};

四、 LeetCode111.二叉树的最小深度

1.题目链接

LeetCode104.二叉树的最大深度

2.思路

(1)这道题一个错解是将LeetCode104.二叉树的最大深度的max直接改成min
图示错误
图示错误
(2)从上图我们看到,在去最小深度时,要排除root->left和root->right中只有一个为空的情况,因为此时root不是叶子结点,但是左侧深度会算成1
(3)因此,要对左子节点或子节点为空的情况进行讨论
1)如果左子树为空,右子树不为空,说明最小深度是右子树的深度+1。

2)右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。 最后如果左右子树都不为空,返回(左右子树深度+1)最小值

3.题解

class Solution {
public:
    int minDepth(TreeNode* root) {
        if (root == NULL)
            return 0;
        int l = minDepth(root->left) + 1;
        int r = minDepth(root->right) + 1;
        if (root->left == NULL && root->right != NULL)
            return r;
        else if (root->right == NULL && root->left != NULL)
            return l;
        else
            return min(l, r);
    }
};

总结

今天的内容应用了好多二叉树遍历的做法,个人对递归更熟悉,主要用递归实现,其实栈和层序遍历也可实现。

  • 20
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值