首页 > 其他分享 >代码随想录day15 | 102.二叉树的层序遍历 226.反转二叉树 101.对称二叉树

代码随想录day15 | 102.二叉树的层序遍历 226.反转二叉树 101.对称二叉树

时间:2022-10-05 01:33:04浏览次数:75  
标签:right cur 层序 随想录 que 二叉树 root vec left

102.二叉树的层序遍历

题目|文章

1.迭代

思路

1.创建一个队列
2.确定每一层的节点个数,对每一层进行遍历,将结果输出。

实现

点击查看代码
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*> que;
        vector<vector<int>> result;
        if(root == nullptr)return result;
        que.push(root);
        while(!que.empty()){
            int size = que.size(); 
            vector<int> vec;
            for(int i = 0; i < size; i++){
                TreeNode* cur = que.front();
                que.pop();
                vec.push_back(cur->val);
                if(cur->left)que.push(cur->left);
                if(cur->right)que.push(cur->right);
            }
            result.push_back(vec);
        }
        return result;
    }
};

226.反转二叉树

题目|文章
image

1.层序遍历

思路

1.建立一个队列
2.确定每一层的节点个数
3.交换每一个节点的左右子节点,并将其加入队列

实现

点击查看代码
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        queue<TreeNode*> que;
        if(root == nullptr) return nullptr;
        que.push(root);
        while(!que.empty()){
            int size = que.size();
            for(int i = 0; i < size; i++){
                TreeNode* cur = que.front();
                que.pop();
                if(cur == nullptr)continue;//也可以通过判断if(cur->left)      
                    TreeNode* temp = cur->left;
                    cur->left = cur->right;
                    cur->right = temp;
                    que.push(cur->left);
                    que.push(cur->right);                
            }
        }
        return root;
    }
};

2.前序遍历(递归是一样的思路)

思路

1.建立栈
2.交换每一个节点的左右子节点

实现

点击查看代码
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        stack<TreeNode*> st;
        if(root != nullptr)st.push(root);
        while(!st.empty()){
            TreeNode* cur = st.top();
            st.pop();
            swap(cur->left,cur->right);
            if(cur->right) st.push(cur->right);
            if(cur->left) st.push(cur->left);
        }
        return root;
    }
};

3.中序遍历.(无法实现)

思路

使用中序遍历时,操作中节点时,会把左右节点互换,左节点的子节点被操作两次。

101.对称二叉树

题目|文章

1.容器

思路

1.创建vector数组
2.对两边同时进行访问和比较
3.在vector中继续插入左右子节点

实现

点击查看代码
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root == nullptr) return true;
        vector<TreeNode*> vec;
        vec.push_back(root->left);
        vec.push_back(root->right);
        while(!vec.empty()){
            TreeNode* p1 = vec.front();
            vec.erase(vec.begin());
            TreeNode* p2 = vec.back();
            vec.pop_back();
            if(!p1 && !p2)continue;
            if(!p1 || !p2 || p1->val != p2 -> val){
                return false;
            }
            vec.insert(vec.begin(),p1->right);
            vec.insert(vec.begin(),p1->left);
            vec.push_back(p2->left);
            vec.push_back(p2->right);
        }
        return true;
    }
};

2.递归

思路

1.参数和返回值
2.终止条件(注意要先保证不是nullptr才可以调用数据left->val)
3.单次遍历逻辑

实现

点击查看代码
class Solution {
public:
    bool compare(TreeNode* left,TreeNode* right){

        if(left == nullptr && right != nullptr)return false;
        else if(left != nullptr && right == nullptr)return false;
        

        
        else if(left == nullptr && right == nullptr) return true;
        else if(left->val != right->val)return false;
       
        bool a = compare(left->left,right->right);
        bool b = compare(left->right,right->left);
        return a && b;


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

标签:right,cur,层序,随想录,que,二叉树,root,vec,left
From: https://www.cnblogs.com/suodi/p/16754865.html

相关文章