二叉树习题详解

文章讲述了在LeetCode平台上与二叉树相关的五道题目,包括右视图层序遍历、层序遍历的变形(包括从左到右和从右到左)、锯齿形层序遍历、路径和以及最大路径和的计算方法,主要使用了队列和递归算法。
摘要由CSDN通过智能技术生成

LCR 046. 二叉树的右视图 - 力扣(LeetCode)

用t来记录每层节点个数,每次队列第一个数都是最右边的数。

class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
        if(root==NULL) return {};
        queue<TreeNode*>q;
        vector<int>v;
        q.push(root);
        while(!q.empty()){
             v.push_back(q.front()->val);
            int t=q.size();
            while(t--)
            {   
                if(q.front()->right!=NULL)
                q.push(q.front()->right);
                if(q.front()->left!=NULL)
                 q.push(q.front()->left);
                q.pop();
            }
           
        }
        return v;
    }
};

107. 二叉树的层序遍历 II - 力扣(LeetCode)

这个是上一个的变形,它先左后右,因为从下往上输出,所以翻转一下就行。

class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
       
       vector<vector<int>>v;
       if(root==NULL)return v;
       queue<TreeNode*>q;
       q.push(root);
       while(!q.empty())
       {
           vector<int>v1;
           int n=q.size();
           while(n--)
           {
             v1.push_back(q.front()->val);
            if(q.front()->left!=NULL)q.push(q.front()->left);
            if(q.front()->right!=NULL)q.push(q.front()->right);
            q.pop();
           }
           v.push_back(v1);
       }
       reverse(v.begin(),v.end());
       return v;
    }
};

103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode)

这个是上一题变体,从左往右从右往左输出,来回交替,只需要加个int记录,奇数层原样,偶数层翻转一下。

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
    vector<vector<int>>v;
    if(root==NULL)return v;
    queue<TreeNode*>q;
    q.push(root);
    int t=0;
    while(!q.empty())
    {
        
        int n=q.size();
        vector<int>v1;
        while(n--)
        {
            v1.push_back(q.front()->val);
            if(q.front()->left!=NULL)q.push(q.front()->left);
            if(q.front()->right!=NULL)q.push(q.front()->right);
            q.pop();
        }
        t++;
        if(t%2==0)reverse(v1.begin(),v1.end());
        v.push_back(v1);
    }
    return v;
    }
};

102. 二叉树的层序遍历 - 力扣(LeetCode)

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
      vector<vector<int>>v;
      if(root==NULL)return v;
      queue<TreeNode*>q;
      q.push(root);
      while(!q.empty())
      {
        vector<int>v1;
        int n=q.size();
        while(n--)
        {
            v1.push_back(q.front()->val);
            if(q.front()->left!=NULL)q.push(q.front()->left);
            if(q.front()->right!=NULL)q.push(q.front()->right);
            q.pop();
        }
        v.push_back(v1);
      }
      return v;
    }
};

LCR 153. 二叉树中和为目标值的路径 - 力扣(LeetCode)

用前序遍历遍历所有路径,每遍历一个节点target=target-节点的值,把当前节点值存入path,

满足条件的路径应该是当前节点是叶子节点且target=0,递归左右节点,回溯,把当前节点弹出。

class Solution {
public:
    
    vector<vector<int>> pathTarget(TreeNode* root, int target) {
     road(root,target);
     return v;
    }
     vector<vector<int>>v;
     vector<int>path;
     void road(TreeNode* root,int t)
     {
        if(root==NULL)return;
        t-=root->val;
        path.push_back(root->val);
        if(t==0 && root->left==NULL && root->right==NULL)
        {
            v.push_back(path);
        }
        road(root->left,t);
        road(root->right,t);
        path.pop_back();
     }
};

LCR 051. 二叉树中的最大路径和 - 力扣(LeetCode)

写个递归,来算每个节点的最大贡献值,一个节点的最大贡献值是它自己的值+max(左孩子贡献值,右孩子贡献值),叶子节点贡献值就是他们本身的值,最大路径的和=当前结点的值+左孩子最大贡献值+右孩子最大贡献值。

class Solution {
public:
    int maxnum=INT_MIN;
    int maxPathSum(TreeNode* root) {
      maxans(root);
      return maxnum;
    }
    int maxans(TreeNode* root)
    {
        if(root==NULL)return 0;
        int leftw=max(maxans(root->left),0);
        int rightw=max(maxans(root->right),0);
        int newpath=root->val+leftw+rightw;
        maxnum=max(maxnum,newpath);
        return root->val+max(leftw,rightw);
    }
};
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值