【LeetCode】五道题搞懂二叉树层序遍历

102. 二叉树的层序遍历

102. 二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回其层次遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
    
    
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
    
    
        vector<vector<int>> res;
        if(root==NULL)
        return res;

        queue<TreeNode*> qt;
        qt.push(root);
        while(!qt.empty()){
    
    
            vector<int> tmp;
            int len=qt.size();
            for(int i=0;i<len;i++){
    
    
                TreeNode* p=qt.front();
                qt.pop();
                tmp.push_back(p->val);
                if(p->left)  qt.push(p->left);
                if(p->right) qt.push(p->right);
            }
        res.push_back(tmp);   
        }
    return res;
        
    }
};

107. 二叉树的层次遍历 II 反转上一题结果

107. 二叉树的层次遍历 II
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

例如:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回其自底向上的层次遍历为:

[
  [15,7],
  [9,20],
  [3]
]
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
    
    
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
    
    
        vector<vector<int>> res;
        if(!root)
        return res;

        queue<TreeNode*> qt;
        qt.push(root);
        while(!qt.empty()){
    
    
            vector<int> tmp;
            int size=qt.size();
            for(int i=0;i<size;i++){
    
    
                TreeNode* tn=qt.front();
                qt.pop();
                tmp.push_back(tn->val);
                if(tn->left)qt.push(tn->left);
                if(tn->right) qt.push(tn->right);
            }
            res.push_back(tmp);
                    
        }
        reverse(res.begin(),res.end());
        return res;
    }
};

199. 二叉树的右视图 返回每一节最后一个结点

199. 二叉树的右视图
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例:

输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:

   1            <---
 /   \
2     3         <---
 \     \
  5     4       <---
通过次数67,764提交次数105,485
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
    
    
public:
    vector<int> rightSideView(TreeNode* root) {
    
    
        vector<int> res;
        queue<TreeNode*> que;
        if(root!=NULL) que.push(root);
        while(!que.empty()){
    
    
            int size=que.size();
            for(int i=0;i<size;i++){
    
    
                TreeNode* cur=que.front();
                que.pop();
                if(i==size-1)
                res.push_back(cur->val);
                if(cur->left) que.push(cur->left);
                if(cur->right) que.push(cur->right);
            }
        }
        return res;
    }
};

637. 二叉树的层平均值 累加求和

637. 二叉树的层平均值
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。

 

示例 1:

输入:
    3
   / \
  9  20
    /  \
   15   7
输出:[3, 14.5, 11]
解释:
第 0 层的平均值是 3 ,1层是 14.5 ,2层是 11 。因此返回 [3, 14.5, 11] 。
 

提示:

节点值的范围在32位有符号整数范围内。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
    
    
public:
    vector<double> averageOfLevels(TreeNode* root) {
    
    
        vector<double> res;
        queue<TreeNode*> que;
        if(root!=NULL)
        que.push(root);

        while(!que.empty()){
    
    
            int size=que.size();
            double sum=0;
            for(int i=0;i<size;i++){
    
    
                TreeNode* cur=que.front();
                que.pop();
                sum+=cur->val;
                if(cur->left) que.push(cur->left);
                if(cur->right) que.push(cur->right);
            }
            res.push_back(sum/(size*1.0));
        }
        return res;
    }
};

429. N叉树的层序遍历 左右结点变为遍历子结点

429. N叉树的层序遍历
给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。

例如,给定一个 3叉树 :

 



 

返回其层序遍历:

[
     [1],
     [3,2,4],
     [5,6]
]
 

说明:

树的深度不会超过 1000。
树的节点总数不会超过 5000
/*
// 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) {
    
    
         vector<vector<int>> res;
        queue<Node*> que;
        if(root!=NULL)
        que.push(root);

        while(!que.empty()){
    
    
            int size=que.size();
            vector<int> tmp;
            for(int i=0;i<size;i++){
    
    
                Node* cur=que.front();
                que.pop();
                tmp.push_back(cur->val);
                for(int i=0;i<cur->children.size();i++){
    
    
                    if(cur->children[i]) que.push(cur->children[i]);
                }
            }
            res.push_back(tmp);
        }
        return res;
    }
    
};

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

猜你喜欢

转载自blog.csdn.net/qq_37581730/article/details/108808777