定义

二叉树的左(右)视图即:以从上到下的顺序,输出一颗二叉树每一层最左(右)端的节点,结果就是其左(右)视图。

步骤

  1. 采用递归的方式,将二叉树的所有节点连带其深度信息存入动态数组(若对二叉树的递归遍历不熟悉,可参考二叉树的创建与遍历 (附C++代码))
  2. 如左视图,以——>——>的顺序将深度和节点信息添加到动态数组,再进行倒序向前覆盖,即可得到左视图结果。右视图原理与左视图相同

形象理解

  1. 对于上树来说,若计算其左视图,则递归后存入动态数组的数据为:

    0, 6, 1, 5, 2, 0, 2, 2, 3, 3, 1, 7, 2, 9

  2. 偶数位为该节点的深度,奇数位为该节点的,以深度为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

  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++代码)相关推荐

  1. Python打印二叉树的左视图、右视图

    先求出二叉树的最大深度,然后求出每一层的节点列表,求每一层节点列表就相当于求距离根节点指定深度的所有节点,再将每一层的节点列表中的最左或最右节点打印出来,或者添加到新列表中,就是二叉树的左视图.右视图 ...

  2. 二叉树的左视图和右视图

    所谓二叉树的左视图,是指打印从左方向看到的二叉树. 根据前序遍历算法思想,在左视图代码中先遍历左子树在遍历左子树,这样在判断level == len(stack)时,先遍历左子树则保证层数与数组长度相 ...

  3. Leetcode_NO199_二叉树的左视图,右视图

    给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, 3, 4] 解释: 1     ...

  4. 解决Creo 5.0在打开stl模型后,无法查看左视图,右视图

    问题 我的Creo 5.0在打开stl模型后,无法查看左视图,右视图,上视图等,现在总结一下解决办法. 解决办法 前视图的设置 导入模型,名字为bool,点击bool,创建平面 前视图,是从y方向看的 ...

  5. Leetcode-199二叉树的右视图(二叉树左视图)

    题目描述 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 输 ...

  6. 二叉树 左视图 /右视图 [Java实现]

    这是2018.12月参加头条笔试的题目.当时什么都不会,没写出来. 明天就要面试了,复盘写一下(我可真懒...) [左视图] 首先说一下什么叫二叉树的左视图. 如图所示,从左边看,输出每行第一个数. ...

  7. Python数据结构与算法题目 打印二叉树的左视图 打印二叉树的右视图 树的左视图 树的右视图

    阅读目录 题目描述 思路与Python实现 题目描述 输入一棵二叉树,求出树的左视图,或者右视图,如下图所示,的两种情况 思路与Python实现 如果可以用非递归的方式写出二叉树的深度遍历或者广度遍历 ...

  8. 47、打印二叉树的右视图 和 左视图

    右视图思路: 层次遍历二叉树: 将每一层的最后一个节点值保存到结果数组: 左视图思路: 层次遍历二叉树: 将每一层的第一个节点值保存到结果数组: (1)右视图代码实现 /*** Definition ...

  9. Leetcode 199.二叉树的右视图

    Time: 20190903 Type: Medium 题目描述 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5 ...

最新文章

  1. Kotlin for 循环使用
  2. 推荐10款Windows系统必备的高效软件!!!
  3. 白宫:太空将成美国新反导防御报告重点关注领域
  4. 低阶 TensorFlow 基础知识
  5. Python3字符串的编码
  6. 第十节:进一步扩展两种安全校验方式
  7. CString LPCTSTR LPTSTR 类型的相互转化
  8. c# RegistryKey 的相关简单操作
  9. 我应该如何验证电子邮件地址?
  10. 程序员,都是内卷之王!
  11. 进程介绍(理论部分)
  12. Android Mobile Web 集成 Webtrends
  13. 15b万用表怎么测电容_万用表怎么用?福禄克15B+一机详解万用表的使用方法
  14. 10亿数据导入oracle方案
  15. 《SteamVR2.0/Input》(Yanlz+SteamVR+Input+OpenVR+Runtime+SteamVR_Action+立钻哥哥+==)
  16. 使OEM分区变成可格式化
  17. calfcamel的2333(java)
  18. linux命令格式和常用命令
  19. IPFS白皮书中文版
  20. Exchange绝妙使用-日历、邮件、通讯录双向同步

热门文章

  1. 春夏喝绿茶花茶、秋冬喝乌龙普洱红茶
  2. CentOS 7 VM虚拟机安装docker步骤
  3. 【金融123】ISDA协议
  4. Mac安装软件提示“已损坏,无法打开”的解决办法
  5. PS制作心跳二维码动画 学会后能增加粉丝关注率哦
  6. 学会感恩,学会分享,开始总结自己的职场经验
  7. 数据中心机房设备标签规范建议
  8. iOS视频播放全屏效果实现
  9. 优化iPhone 的 wifi漫游
  10. 什么区块链,统统都是骗局?