广州高端品牌网站建设后台管理便捷怎么联系网站管理员
广州高端品牌网站建设后台管理便捷,怎么联系网站管理员,wordpress授权系统,公司网站建设方案书例文前言
二叉树层序遍历应用题目。 记录三十八 【二叉树的层次遍历应用一】 继续。 一、【107.二叉树的层次遍历 II】
题目
给你二叉树的根节点 root #xff0c;返回其节点值 自底向上的层序遍历 。 #xff08;即按从叶子节点所在层到根节点所在的层#xff0c;逐层从左向…前言
二叉树层序遍历应用题目。 记录三十八 【二叉树的层次遍历应用一】 继续。 一、【107.二叉树的层次遍历 II】
题目
给你二叉树的根节点 root 返回其节点值 自底向上的层序遍历 。 即按从叶子节点所在层到根节点所在的层逐层从左向右遍历
示例 1
输入root [3,9,20,null,null,15,7]
输出[[15,7],[9,20],[3]]示例 2
输入root [1]
输出[[1]]示例 3
输入root []
输出[]提示
树中节点数目在范围 [0, 2000] 内
-1000 Node.val 1000思路
题目的意思是从底层逐步往上输出相当于【102.二叉树的层序遍历】 倒着输出。
那么reverse从上到下的结果加一句reverse(result.begin(),result.end());
代码实现
/*** 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:vectorvectorint levelOrderBottom(TreeNode* root) {vectorvectorint result;queueTreeNode* que;if(root ! nullptr) que.push(root);while(!que.empty()){int size que.size(); //在还没遍历这一层时先把这一层的元素个数记录下来。vectorint levelrecord;while(size--){ //边遍历边放入下一层元素。TreeNode* top que.front();que.pop();if(top-left) que.push(top-left);if(top-right) que.push(top-right);levelrecord.push_back(top-val);}result.push_back(levelrecord);}reverse(result.begin(),result.end()); //新增一行return result; }
};二、【199.二叉树的右视图】
题目
给定一个二叉树的 根节点 root想象自己站在它的右侧按照从顶部到底部的顺序返回从右侧所能看到的节点值。
示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 示例 2:
输入: [1,null,3]
输出: [1,3]示例 3:
输入: []
输出: []提示:
二叉树的节点个数的范围是 [0,100]
-100 Node.val 100 思路
1如果只从示例1考虑右视图只看右孩子右孩子的右孩子……。这样如果右孩子为空左孩子的右孩子也在右视图的范围内。不合理。 2仍然遍历每一层的节点但是当该层的最后一个节点出去的时候放到result中。
代码实现
/*** 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:vectorint rightSideView(TreeNode* root) {vectorint result;queueTreeNode* que;if(root ! nullptr) que.push(root);while(!que.empty()){int size que.size();while(size--){TreeNode* cur que.front();que.pop();if(cur-left) que.push(cur-left);if(cur-right) que.push(cur-right);if(size 0){result.push_back(cur-val);}}}return result;}
};参考思路链接 思路一致不过参考代码用的循环时for而已。 三、【637.二叉树的层平均值】
题目
给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。
示例 1
输入root [3,9,20,null,null,15,7]
输出[3.00000,14.50000,11.00000]
解释第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11 。
因此返回 [3, 14.5, 11] 。示例 2:
输入root [3,9,20,15,7]
输出[3.00000,14.50000,11.00000]提示
树中节点数量在 [1, 10^4] 范围内
-2^31 Node.val 2^31 - 1思路
每层遍历后sum求和除以size。所以不能用while(size- -)循环size会改变。改成for循环。
代码实现
/*** 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:vectordouble averageOfLevels(TreeNode* root) {vectordouble result;queueTreeNode* que;if(root ! nullptr) que.push(root);while(!que.empty()){int size que.size();double sum 0;for(int i0;i size;i){TreeNode* cur que.front();que.pop();if(cur-left) que.push(cur-left);if(cur-right) que.push(cur-right);sum cur-val;}result.push_back(sum/size); //不能用size--while循环。不然此处的size发生改变。}return result;}
};四、实现二叉树的结构
力扣题目输入root [3,9,20,null,null,15,7]代表构造一个二叉树。那么具体如何实现力扣不考察。
但是就给定输入vector string root [3,9,20,null,null,15,7]实现二叉树的构造这一函数练习一下。相当于ACM模式下创建二叉树
#include string
#include vector
#include iostream
#include queue
using namespace std;
//定义节点结构
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) {}};//构造二叉树
TreeNode* createTree(vectorstring tree){queueTreeNode* que;if(tree.empty()) return nullptr;TreeNode* root new TreeNode(stoi(tree[0]));que.push(root);int i 0;while(!que.empty()){TreeNode* cur que.front();que.pop();//创建左孩子if((2*i1) tree.size() tree[2*i1] ! null){ TreeNode* leftchild new TreeNode(stoi(tree[2*i1]));que.push(leftchild);cur-left leftchild;}//创建右孩子if((2*i2) tree.size() tree[2*i2] ! null){TreeNode* rightchild new TreeNode(stoi(tree[2*i2]));que.push(rightchild);cur-right rightchild;}i; }return root;
}//销毁二叉树用递归法练习递归走后序遍历的流程
void destoryTree(TreeNode* root){if(root nullptr){return;}destoryTree(root-left);destoryTree(root-right);delete root;
}int main(){vectorstring tree {3,9,20,null,null,15,7};TreeNode* root createTree(tree);destoryTree(root);return 0;
}总结
前三点利用层序遍历的模版使用队列结构遍历每层的练习题最后从0实现实现一个二叉树创建、销毁、定义。
欢迎指正转载标明出处
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/87456.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!