代码随想录算法训练营第15天|层序遍历 226翻转二叉树 101 对称二叉树

文章介绍了如何使用层序遍历解决多种二叉树问题,包括翻转二叉树和判断对称二叉树。层序遍历借助队列实现,通过改变遍历方式可以解决107题和199题等。对于翻转二叉树,提供了递归和迭代两种方法。对称二叉树的判断通过比较左右子树的对称性完成。
摘要由CSDN通过智能技术生成

层序遍历

层序遍历需要借助队列实现,其主要结构为

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())
        {
            int size=que.size();
            vector<int>res;
            for(int i=0;i<size;i++)
            {
                TreeNode* cur=que.front();
                que.pop();
                res.push_back(cur->val);
                if(cur->left)   que.push(cur->left);
                if(cur->right)  que.push(cur->right);
            }
            result.push_back(res);
        }
        return result;
    }
};

通过上述基本结构,用于完成以下10道题。
107 层序遍历2 该题中,我们只需要在末尾加入一个reverse函数,将原本的结果翻转即可。
199 二叉树右视图该题,我们仍然采用层序遍历算法,需要改动的是,我们只需要记下每一层的最后一个节点即可。无需将该层所有的节点记下。
637 二叉树的层平均值
429 N叉树的层序遍历
515 在每个树行中找最大值
116 填充每个节点的下一个右侧节点指针 进阶版的解答还没认真思考,下次补上代码。
104 二叉树的最大深度
111 二叉树的最小深度 我们只需要判断当前节点的左右节点是否为空,如果为空,则直接返回它的深度即可。

翻转二叉树

题目链接:226 翻转二叉树
解题思路:

在本题中,只需要在遍历的时候,交换一下左右两个节点即可。

递归法

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;

    }
};

统一迭代法

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

                st.push(cur);
                st.push(NULL);
                

            }
            else{
                st.pop();
                cur=st.top();
                swap(cur->left,cur->right);
                st.pop();
            }
        }
        return root;
       

    }
};

101 对称二叉树

题目链接:101 对称二叉树
题目描述:给你一个二叉树的根节点 root , 检查它是否轴对称。

解题思路:
一般来说判断是否为对称的,需要判断以下几个方面

  1. 左右子树都为空,对称
  2. 左子树不为空,右子树为空,不对称
  3. 左子树为空,右子树不为空,不对称
  4. 左右子树的值不同,不对称
  5. 记下判断左子树的左子树和右子树的右子树,左子树的右子树和右子树的左子树。
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root==NULL)  return true;
        return compare(root->left,root->right);
    }
    bool compare(TreeNode* left,TreeNode*right)
    {
        if(left==NULL&&right==NULL) return true;
        else if(left!=NULL&&right==NULL)    return false;
        else if(left==NULL&&right!=NULL)    return false;
        else if(left->val!=right->val)  return false;
        else return compare(left->left,right->right)&&compare(left->right,right->left);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值