二叉树的左视图和右视图 形象理解(附C++代码)
定义
二叉树的左(右)视图即:以从上到下的顺序,输出一颗二叉树每一层最左(右)端的节点,结果就是其左(右)视图。
步骤
- 采用递归的方式,将二叉树的所有节点连带其深度信息存入动态数组(若对二叉树的递归遍历不熟悉,可参考二叉树的创建与遍历 (附C++代码))
- 如左视图,以根——>左——>右的顺序将深度和节点信息添加到动态数组,再进行倒序向前覆盖,即可得到左视图结果。右视图原理与左视图相同
形象理解
对于上树来说,若计算其左视图,则递归后存入动态数组的数据为:
0, 6, 1, 5, 2, 0, 2, 2, 3, 3, 1, 7, 2, 9
偶数位为该节点的深度,奇数位为该节点的值,以深度为Key值为Value将该动态数组存入字典(map),采用从后向前进行存储。以深度2来说
key:2, value:9
先被存入,但由于逆序更新,则key:2
的值会最终被key:2, value:0
更新,最终的字典中存放的键值对为[key:0, value:6], [key:1, value:5], [key:2, value:0], [key:3, value:3
。将字典中的value按照深度递增的顺序输出,即得到左视图
右视图与左视图的遍历顺序向反,但是逆序更新的顺序与原理相同。
C++代码
生成左右视图时用到的逆序覆盖函数
传入的
vector
为以左优先或右优先存入的,完整的深度与节点值信息
void reUpdate(vector<float> &result) {map<int, float> mp;// 逆序更新for(int i = result.size() - 1; i >0; i -= 2) {auto pos = mp.find((int)result[i - 1]);// 如果已经存在则更新,若不存在则添加if(pos != mp.end()) {pos->second = result[i]; // 更新} else {mp.insert(make_pair((int)result[i - 1], result[i]));}}// 清空原resultvector<float>().swap(result);// 将mp的结果放入result,并输出结果for(auto pair : mp) {result.push_back(pair.second);}}
左视图处理函数
/*二叉树左视图*/
// 递归部分
void preLeftView(Node & node, vector<float> &result, const int deep = 0) {result.push_back(deep);result.push_back(node.data);if(node.leftChiled != nullptr) {preLeftView(*(node.leftChiled), result, deep + 1);}if(node.rightChiled != nullptr) {preLeftView(*(node.rightChiled), result, deep + 1);}}// 左视图生成函数
void leftView(Node & node) {vector<float> result;preLeftView(node, result);// 逆序更新resultreUpdate(result);for(auto x : result) {cout << x << " ";}}
右视图处理函数
/*二叉树右视图*/
// 递归部分
void preRightView(Node & node, vector<float> &result, const int deep = 0) {result.push_back(deep);result.push_back(node.data);if(node.rightChiled != nullptr) {preRightView(*(node.rightChiled), result, deep + 1);}if(node.leftChiled != nullptr) {preRightView(*(node.leftChiled), result, deep + 1);}}// 右视图生成部分
void rightView(Node & node) {vector<float> result;preRightView(node, result);// 逆序更新resultreUpdate(result);for(auto x : result) {cout << x << " ";}}
主函数
int main() {// 创建二叉树的根及若干节点Node root(6);Node one(5);Node two(7);Node three(0);Node four(2);Node five(9);Node six(3);// 拼接节点root.leftChiled = &one;root.rightChiled = &two;one.leftChiled = &three;one.rightChiled = &four;two.rightChiled = &five;four.rightChiled = &six;// 二叉树左视图cout << "左视图结果" << endl;leftView(root);cout << endl;cout << endl;// 二叉树右视图cout << "右视图结果" << endl;rightView(root);cout << endl;cout << endl;
}
二叉树的左视图和右视图 形象理解(附C++代码)相关推荐
- Python打印二叉树的左视图、右视图
先求出二叉树的最大深度,然后求出每一层的节点列表,求每一层节点列表就相当于求距离根节点指定深度的所有节点,再将每一层的节点列表中的最左或最右节点打印出来,或者添加到新列表中,就是二叉树的左视图.右视图 ...
- 二叉树的左视图和右视图
所谓二叉树的左视图,是指打印从左方向看到的二叉树. 根据前序遍历算法思想,在左视图代码中先遍历左子树在遍历左子树,这样在判断level == len(stack)时,先遍历左子树则保证层数与数组长度相 ...
- Leetcode_NO199_二叉树的左视图,右视图
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, 3, 4] 解释: 1 ...
- 解决Creo 5.0在打开stl模型后,无法查看左视图,右视图
问题 我的Creo 5.0在打开stl模型后,无法查看左视图,右视图,上视图等,现在总结一下解决办法. 解决办法 前视图的设置 导入模型,名字为bool,点击bool,创建平面 前视图,是从y方向看的 ...
- Leetcode-199二叉树的右视图(二叉树左视图)
题目描述 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 输 ...
- 二叉树 左视图 /右视图 [Java实现]
这是2018.12月参加头条笔试的题目.当时什么都不会,没写出来. 明天就要面试了,复盘写一下(我可真懒...) [左视图] 首先说一下什么叫二叉树的左视图. 如图所示,从左边看,输出每行第一个数. ...
- Python数据结构与算法题目 打印二叉树的左视图 打印二叉树的右视图 树的左视图 树的右视图
阅读目录 题目描述 思路与Python实现 题目描述 输入一棵二叉树,求出树的左视图,或者右视图,如下图所示,的两种情况 思路与Python实现 如果可以用非递归的方式写出二叉树的深度遍历或者广度遍历 ...
- 47、打印二叉树的右视图 和 左视图
右视图思路: 层次遍历二叉树: 将每一层的最后一个节点值保存到结果数组: 左视图思路: 层次遍历二叉树: 将每一层的第一个节点值保存到结果数组: (1)右视图代码实现 /*** Definition ...
- Leetcode 199.二叉树的右视图
Time: 20190903 Type: Medium 题目描述 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5 ...
最新文章
- Kotlin for 循环使用
- 推荐10款Windows系统必备的高效软件!!!
- 白宫:太空将成美国新反导防御报告重点关注领域
- 低阶 TensorFlow 基础知识
- Python3字符串的编码
- 第十节:进一步扩展两种安全校验方式
- CString LPCTSTR LPTSTR 类型的相互转化
- c# RegistryKey 的相关简单操作
- 我应该如何验证电子邮件地址?
- 程序员,都是内卷之王!
- 进程介绍(理论部分)
- Android Mobile Web 集成 Webtrends
- 15b万用表怎么测电容_万用表怎么用?福禄克15B+一机详解万用表的使用方法
- 10亿数据导入oracle方案
- 《SteamVR2.0/Input》(Yanlz+SteamVR+Input+OpenVR+Runtime+SteamVR_Action+立钻哥哥+==)
- 使OEM分区变成可格式化
- calfcamel的2333(java)
- linux命令格式和常用命令
- IPFS白皮书中文版
- Exchange绝妙使用-日历、邮件、通讯录双向同步