代码随想录算法训练营第十五天|102. 二叉树的层序遍历等十道题、226. 翻转二叉树、101. 对称二叉树

文章详细介绍了使用迭代和递归方法解决LeetCode上的多个二叉树问题,包括层序遍历、右视图、层平均值等,提供了详细的解题思路和代码实现。
摘要由CSDN通过智能技术生成

代码随想录刷题02.27

二叉树相关操作2

LeetCode题目

102. 二叉树的层序遍历

解题思路

1.迭代法:

1)二叉树的迭代遍历要依赖栈/队列等数据结构,并且迭代过程也是针对的栈/队列这些数据结构;

2)本题的思路是根节点出栈时向队列中入子节点;

3)注意剪枝情况,当根节点为空时,要避开操作node->right这类操作。

2.递归法:

1)本体的递归思路:

i)共三个形参,root、depth和二维动态数组result,其中,向上传递root、depth,所需要的result一直

存结果;

ii)终止边界条件仍然是当节点root==nullptr时;

iii)当result.size()==depth时,向result数组中加入空的一维数组,否则将对应的节点数据存

result[depth]中。

代码过程
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
    void order(TreeNode* root,vector<vector<int>>&result,int depth){
        if(root==nullptr)return;
        if(result.size()==depth)result.push_back(vector<int>());
        result[depth].push_back(root->val);
        order(root->left,result,depth+1);
        order(root->right,result,depth+1);
    }
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        int depth=0;
        vector<vector<int>>result;
        order(root,result,depth);
        return result;
        /*queue<TreeNode*>que;
        vector<vector<int>>result;
        que.push(root);
        while(!que.empty())
        {
            int size=que.size();
            vector<int>vec;
            while(size--)
            {
                TreeNode* node=que.front();
                que.pop();
                if(node==nullptr)continue;
                if(node->left)que.push(node->left);
                if(node->right)que.push(node->right);
                vec.push_back(node->val);
            }
            if(vec.empty())continue;
            result.push_back(vec);
        }
        return result;*/
    }
};

LeetCode题目

107. 二叉树的层序遍历 II

解题思路
代码过程
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        queue<TreeNode*>que;
        vector<vector<int>>result;
        if(root==nullptr)return{};
        que.push(root);
        while(!que.empty())
        {
            int size=que.size();
            vector<int>vec;
            while(size--)
            {
                TreeNode* node=que.front();
                que.pop();
                if(node->left)que.push(node->left);
                if(node->right)que.push(node->right);
                vec.push_back(node->val);
            }
            result.push_back(vec);
        }
        reverse(result.begin(),result.end());
        return result;
    }
};

LeetCode题目

199. 二叉树的右视图

解题思路
代码过程
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
        queue<TreeNode*>que;
        vector<int>result;
        if(root==nullptr)return{};
        que.push(root);
        while(!que.empty())
        {
            int size=que.size();
            vector<int>vec;
            while(size--)
            {
                TreeNode* node=que.front();
                que.pop();
                if(node->left)que.push(node->left);
                if(node->right)que.push(node->right);
                vec.push_back(node->val);
            }
            result.push_back(*(vec.end()-1));
        }
        return result;
    }
};

LeetCode题目

637. 二叉树的层平均值

解题思路
代码过程
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<double> averageOfLevels(TreeNode* root) {
        queue<TreeNode*>que;
        vector<double>result;
        if(root==nullptr)return{};
        que.push(root);
        while(!que.empty())
        {
            int size=que.size();
            double sum=0.0;
            for(int i=0;i<size;i++)
            {
                TreeNode* node=que.front();
                que.pop();
                if(node->left)que.push(node->left);
                if(node->right)que.push(node->right);
                sum+=node->val;
            }
            result.push_back(sum/size);
        }
        return result;
    }
};

LeetCode题目

429. N 叉树的层序遍历

解题思路

**小tips:*构造N叉树,可以把子节点地址存储到一个数组vector<Node>中。

代码过程
/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
public:
    vector<vector<int>> levelOrder(Node* root) {
        queue<Node*>que;
        vector<vector<int>>result;
        if(root==nullptr)return{};
        que.push(root);
        while(!que.empty())
        {
            int size=que.size();
            vector<int>vec;
            while(size--)
            {
                Node* node=que.front();
                que.pop();
                vec.push_back(node->val);
                for(int i=0;i<(node->children.size());i++)
                {
                    if(node->children[i]!=nullptr)
                        que.push(node->children[i]);
                }
            }
            result.push_back(vec);
        }
        return result;
    }
};

LeetCode题目

515. 在每个树行中找最大值

解题思路

1.找到一个最小值(而不是给整个数列排序的话)可以额外设置一个变量,将变量与数列中数进行比较即可;

2.表示最小值:INT_MIN;表示最大值:INT_MAX

代码过程
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> largestValues(TreeNode* root) {
        queue<TreeNode*>que;
        vector<int>result;
        if(root==NULL)return{};
        que.push(root);
        while(!que.empty())
        {
            int size=que.size();
            int resultmax=INT_MIN;
            while(size--)
            {
                TreeNode* node=que.front();
                que.pop();
                resultmax=resultmax>node->val?resultmax:node->val;
                if(node->left)que.push(node->left);
                if(node->right)que.push(node->right);
            }
            result.push_back(resultmax);
        }
        return result;
    }
};

LeetCode题目

116. 填充每个节点的下一个右侧节点指针

解题思路

要点:抓住queue的出队和进队来分析

代码过程
/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/

class Solution {
public:
    Node* connect(Node* root) {
        queue<Node*>que;
        if(root==NULL)return{};
        que.push(root);
        while(!que.empty())
        {
            int size=que.size();
            for(int i=0;i<size;i++)
            {
                Node* node=que.front();
                que.pop();
                if(i==(size-1))node->next=nullptr;
                else node->next=que.front();
                if(node->left)que.push(node->left);
                if(node->right)que.push(node->right);
            }
        }
        return root;
    }
};

LeetCode题目

117. 填充每个节点的下一个右侧节点指针 II

解题思路
代码过程
/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/

class Solution {
public:
    Node* connect(Node* root) {
        queue<Node*>que;
        if(root==NULL)return{};
        que.push(root);
        while(!que.empty())
        {
            int size=que.size();
            for(int i=0;i<size;i++)
            {
                Node* node=que.front();
                que.pop();
                if(i==(size-1))node->next=nullptr;
                else node->next=que.front();
                if(node->left)que.push(node->left);
                if(node->right)que.push(node->right);
            }
        }
        return root;
    }
};

LeetCode题目

104. 二叉树的最大深度

解题思路
代码过程
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* root) {
        queue<TreeNode*>que;
        int count=0;
        if(root==NULL)return{};
        que.push(root);
        while(!que.empty())
        {
            int size=que.size();
            int resultmax=INT_MIN;
            while(size--)
            {
                TreeNode* node=que.front();
                que.pop();
                resultmax=resultmax>node->val?resultmax:node->val;
                if(node->left)que.push(node->left);
                if(node->right)que.push(node->right);
            }
            count++;
        }
        return count;        
    }
};

LeetCode题目

111. 二叉树的最小深度

解题思路
代码过程
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int minDepth(TreeNode* root) {
        queue<TreeNode*>que;
        int count=0;
        if(root==NULL)return{};
        que.push(root);
        while(!que.empty())
        {
            int size=que.size();
            count++;
            while(size--)
            {
                TreeNode* node=que.front();
                que.pop();
                if(node->left)que.push(node->left);
                if(node->right)que.push(node->right);
                if(node->left==nullptr&&node->right==nullptr)return count;
            }
        }
        return count; 
    }
};

LeetCode题目

226. 翻转二叉树

解题思路

1.针对本题,无论是递归法还是迭代法,都是要“拿出1个节点,然后用swap函数反转其子节点”;

2.用递归法时,抓住输入与返回的形参以及执行的操作,要能构思出如何搭建出“递归梯子”,还要注意单个递归体再递归中的演化效果;

代码过程
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        //递归法
        if(root==nullptr)return root;
        swap(root->left,root->right);
        invertTree(root->left);
        invertTree(root->right);
        return root;
        //迭代法
        /*stack<TreeNode*>st;
        if(root==NULL)return root;
        st.push(root);
        while(!st.empty())
        {
            int size=st.size();
            while(size--)
            {
                TreeNode*node=st.top();
                swap(node->left,node->right);
                st.pop();
                if(node->left)st.push(node->left);
                if(node->right)st.push(node->right);
            }
        }
        return root;*/
    }
};

LeetCode题目

101. 对称二叉树

解题思路

递归书写思路:

1)形参如何确定:需要确定输入形参和返回形参,可能需要多次调试;

2)终止条件如何写:排除上一层终止条件即可进入下一层;

3)递归体如何书写:进入子层(二叉树里面就是2个子层),确定返回条件;

代码过程
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool travel(TreeNode*left,TreeNode*right)
    {
        if(left==nullptr&&right==nullptr)return true;
        else if(left==nullptr&&right!=nullptr)return false;
        else if(left!=nullptr&&right==nullptr)return false;
        else if(left->val!=right->val)return false;
        else{
            bool outside=travel(left->right,right->left);
            bool inside=travel(left->left,right->right);
            bool result=outside&&inside;
            return result;
        }
    }
    bool isSymmetric(TreeNode* root) {
        bool result=travel(root->left,root->right);
        return result;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值