1. #include <vector>
  2. #include <stack>
  3. #include <queue>
  4. using namespace std;
  5.  
  6. struct TreeNode{
  7. int val;
  8. TreeNode* left;
  9. TreeNode* right;
  10. TreeNode(int x):val(x),left(nullptr),right(nullptr){};
  11. };
  12.  
  13. void preOrder(TreeNode* root,vector<int>& res){
  14. if(root == nullptr) return;
  15. res.push_back(root->val);
  16. preOrder(root->left,res);
  17. preOrder(root->right,res);
  18. }
  19.  
  20. void inOrder(TreeNode* root,vector<int>& res){
  21. if(root == nullptr) return;
  22. inOrder(root->left,res);
  23. res.push_back(root->val);
  24. inOrder(root->right,res);
  25. }
  26.  
  27. void postOrder(TreeNode* root,vector<int>& res){
  28. if(root == nullptr) return;
  29. postOrder(root->left,res);
  30. postOrder(root->right,res);
  31. res.push_back(root->val);
  32. }
  33.  
  34. vector<int> preOrder(TreeNode* root){
  35. vector<int> res;
  36. if(root == nullptr) return res;
  37.  
  38. stack<TreeNode*> st;
  39. TreeNode* cur = root;
  40. while(cur || !st.empty()){
  41. while(cur){
  42. res.push_back(cur->val);
  43. st.push(cur);
  44. cur = cur->left;
  45. }
  46. if(!st.empty()){
  47. cur = st.top();
  48. st.pop();
  49. cur = cur->right;
  50. }
  51. }
  52. return res;
  53. }
  54.  
  55. vector<int> inOrder(TreeNode* root){
  56. vector<int> res;
  57. if(root==nullptr) return res;
  58.  
  59. stack<TreeNode*> st;
  60. TreeNode* cur = root;
  61. while(cur || !st.empty()){
  62. while(cur){
  63. st.push(cur);
  64. cur = cur->left;
  65. }
  66. if(!st.empty()){
  67. cur = st.top();
  68. st.pop();
  69. res.push_back(cur->val);
  70. cur = cur->right;
  71. }
  72. }
  73. return res;
  74. }
  75.  
  76. vector<int> postOrder(TreeNode* root){
  77. vector<int> res;
  78. if(root == nullptr) return res;
  79.  
  80. stack<TreeNode*> st;
  81. TreeNode* cur = root;
  82. while(cur){
  83. st.push(cur);
  84. cur = cur->left;
  85. }
  86.  
  87. TreeNode* lastVisited = nullptr;
  88. while(!st.empty()){
  89. cur = st.top();
  90. st.pop();
  91. if(cur->right == nullptr || cur->right == lastVisited){
  92. res.push_back(cur->val);
  93. lastVisited = cur;
  94. }else{
  95. st.push(cur);
  96. cur = cur->right;
  97. while(cur){
  98. st.push(cur);
  99. cur = cur->left;
  100. }
  101. }
  102. }
  103. return res;
  104. }
  105.  
  106. vector<int> levelOrder(TreeNode* root){
  107. vector<int> res;
  108. if(root == nullptr) return res;
  109.  
  110. queue<TreeNode*> q;
  111. q.push(root);
  112. while(!q.empty()){
  113. size_t n = q.size();
  114. for(size_t i=;i<n;i++){
  115. TreeNode* cur = q.back();
  116. q.pop();
  117. res.push_back(cur->val);
  118. if(cur->left) q.push(cur->left);
  119. if(cur->right) q.push(cur->right);
  120. }
  121. }
  122. return res;
  123. }

面试:C++二叉树遍历(递归/非递归)的更多相关文章

  1. java数据结构之二叉树遍历的非递归实现

    算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对 ...

  2. 二叉树遍历(非递归版)——python

    二叉树的遍历分为广度优先遍历和深度优先遍历 广度优先遍历(breadth first traversal):又称层次遍历,从树的根节点(root)开始,从上到下从从左到右遍历整个树的节点. 深度优先遍 ...

  3. c/c++二叉树的创建与遍历(非递归遍历左右中,破坏树结构)

    二叉树的创建与遍历(非递归遍历左右中,破坏树结构) 创建 二叉树的递归3种遍历方式: 1,先中心,再左树,再右树 2,先左树,再中心,再右树 3,先左树,再右树,再中心 二叉树的非递归4种遍历方式: ...

  4. 二叉树的递归,非递归遍历(C++)

    二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...

  5. 递归/非递归----python深度遍历二叉树(前序遍历,中序遍历,后序遍历)

    递归代码:递归实现很简单 '二叉树结点类' class TreeNode: def __init__(self, x): self.val = x self.left = None self.righ ...

  6. c/c++叉树的创建与遍历(非递归遍历左右中,不破坏树结构)

    二叉树的创建与遍历(非递归遍历左右中,不破坏树结构) 创建 二叉树的递归3种遍历方式: 1,先中心,再左树,再右树 2,先左树,再中心,再右树 3,先左树,再右树,再中心 二叉树的非递归4种遍历方式: ...

  7. 【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)

    一.搜索二叉树的插入,查找,删除 简单说说搜索二叉树概念: 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右 ...

  8. Reverse Linked List 递归非递归实现

    单链表反转--递归非递归实现 Java接口: ListNode reverseList(ListNode head) 非递归的实现 有2种,参考 头结点插入法 就地反转 递归的实现 1) Divide ...

  9. 二叉树的先序、中序以及后序遍历(递归 && 非递归)

    树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二 ...

  10. 二叉树——遍历篇(递归/非递归,C++)

    二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...

随机推荐

  1. 网络编程socket、udp

    PS:主机字节顺序,个位在低字节上 计算机本身不能通讯,使通过在同一主机或者不同主机内的软件进行数据传输. 套接字socket:套接字socket可以参照文件指针来理解,文件指针是表示对文件打开进行某 ...

  2. Java理论学时第四节。课后作业。

    请查看String.equals()方法的实现代码,注意学习其实现方法. public class StringEquals { public static void main(String[] ar ...

  3. 杭电2133What day is it

    给你个日期 问是星期几        知道1 1 1是周1就行了 #include <iostream>#include <cstdio>using namespace std ...

  4. Linux vi 文本代码时显示行号或不显示行号

    Linux vi 文本代码时显示行号或不显示行号 前提  安装了vim $vi ~/.vimrc 显示的话加上 set nu 不想显示的话可以注释掉 "set nu 之后 $source ~ ...

  5. AngularJS ngTemplate寄宿方式 模板缓存 $templateCache

    AngularJS的指令中经常定义模板(template或templateUrl),可以选择将Html模板直接寄宿在WEB容器中,如Tomcat.IIS.Nginx.NodeJs Express,也可 ...

  6. jacoco初探

    # 背景 集团的代码覆盖率平台因为网络问题无法使用,只能自己研究下. 覆盖率是衡量自动化用例效果产品的一个指标,但只是一个辅助指标,覆盖率高并不意味着质量好,但覆盖率低却能说明一些问题, # 对比 覆 ...

  7. 设置 Nuget 本地源、在线私有源、自动构建打包

    设置 Nuget 本地源.在线私有源.自动构建打包 本文演示如果在项目中生成 Nuget 包,并添加 Nuget 本地源,不用发布到 Nuget 服务器.再附带使用在线私有源的简单方法,以及提交代码自 ...

  8. [机翻] WIRER ON THE WIRE - SIGNALR协议的非正式描述

    原文 原文很简单,以下为机翻 WIRER ON THE WIRE - SIGNALR协议的非正式描述 我已经看到询问有关SignalR协议的描述的问题出现了很多.哎呀,当我开始关注SignalR时,我 ...

  9. ModelValidator基于元数据的验证

    ModelValidator主要是应用在ModelMetadata元数据的类型上或类型属性上.它是验证的基础类型,所有的ModelValidatorProviders.DataAnnotationVa ...

  10. Redis---quickList(快速列表)

    1. 概述 考虑到链表的附加空间相对太高,prev 和 next 指针就要占去 16 个字节 (64bit 系统的指针是 8 个字节),另外每个节点的内存都是单独分配,会加剧内存的碎片化,影响内存管理 ...