代码随想录训练营 Day15 二叉树 part02 层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉树 2

层序遍历  10

题目链接:102. 二叉树的层序遍历 - 力扣(LeetCode)
文章链接:代码随想录 (programmercarl.com)
视频链接:讲透二叉树的层序遍历 | 广度优先搜索 | LeetCode:102.二叉树的层序遍历 

二叉树的层序遍历:即逐层地,从左到右访问所有节点

这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。

我们可以用队列和一个二位数组解决这个问题。

代码如下:

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*> que;
        vector<vector<int>> result;
        if(root!=NULL) que.push(root);
        while(que.empty()==false)
        {
            int size=que.size();//size记录每一层元素的个数
            vector<int> ver;
            for(int i=1;i<=size;i++)
            {
                TreeNode* node=que.front();//新建树节点存储即将删去的队元素
                que.pop();
                if(node->left) que.push(node->left);//加入左孩子
                if(node->right) que.push(node->right);//加入有孩子
                ver.push_back(node->val);//将删去节点的值存入ver数组中
            }
             result.push_back(ver);将每层所形成的ver数组存入二维数组result中
        }
        return result;
    }
};

while(que.empty()   ----->实现每层的循环

int size=que.size();   记录每一层的元素,由于经过for里的删减增加 que.siz()会随之改变

226.翻转二叉树

题目链接:226. 翻转二叉树 - 力扣(LeetCode)
文章链接:代码随想录 (programmercarl.com)
视频链接:听说一位巨佬面Google被拒了,因为没写出翻转二叉树 | LeetCode:226.翻转二叉树 

再解决这道题之前,我们要了解swap函数可以实现一个节点左右孩子的交换

swap(root->left,root->right);

这道题可以用递归解决。

我们要确定递归三部曲:

  1. 确定递归函数的参数和返回值
  2. 确定终止条件
  3. 确定单层递归的逻辑

1.确定递归函数的参数和返回值:TreeNode * root

TreeNode* invertTree(TreeNode* root)

2.确定终止条件:当节点为空时终止

if(root==NULL) return root;

3.确定单层逻辑:

这道题可以用深搜中的前序(中左右)或者后序(中右左)来解决。(不推荐中序)

前序:

swap(root->left, root->right);
invertTree(root->left);
invertTree(root->right);

后序:

invertTree(root->left);
invertTree(root->right);
swap(root->left, root->right);

中序(左中右)为什么不行,我们思考一下,我们一开始对左子树进行反转,接着通过中,将左右子树反转,那我这个右反转的不还是原来的左子树吗?

所以如果真要写中序代码的话,应该是左中左。代码如下:

invertTree(root->left);
swap(root->left, root->right);
invertTree(root->left);

总代码如下:

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

101.对称二叉树 

题目链接:226. 翻转二叉树 - 力扣(LeetCode)
文章链接:代码随想录 (programmercarl.com)
视频链接:听说一位巨佬面Google被拒了,因为没写出翻转二叉树 | LeetCode:226.翻转二叉树 

 这道题我觉得难度并不大,也并没有运用到啥算法,主要还是对二叉树的理解。

依旧可以使用递归来做。

递归三部曲:

确定递归参数和返回值:注意!这里的两个参数是根节点的左右两个子树

 bool compare(TreeNode* left,TreeNode* right)

确定递归终止条件

1.一边为空,一边不为空,返回false

2.两边对为空,返回true

3.两边都不为空,且值不同,返回false

 if(left==NULL&&right!=NULL) return false;
        else if(left!=NULL&&right==NULL) return false;
        else if(left==NULL&&right==NULL) return true;
        else if(left->val!=right->val) return false;

3.确定单层逻辑:

就是判定外侧和里侧是否都对称,如果都对称再看中间

bool outside=compare(left->left,right->right);
        bool inside=compare(left->right,right->left);
        bool mid=outside&&inside;
        return mid;

总代码如下:

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

OKOK! Day15打卡成功!四分之一已经过去了,一定要坚持下去!耗时3.5小时。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值