树结点

  1. struct TreeNode {
  2. int val;
  3. struct TreeNode *left;
  4. struct TreeNode *right;
  5. TreeNode(int x):val(x),left(NULL),right(NULL){}
  6. };
  7. typedef struct TreeNode TreeNode;
访问函数
  1. void visit(TreeNode *root)
  2. {
  3. if(root)
  4. cout <<root->val<<" ";
  5. }
前序递归
  1. void preorder(TreeNode *root)
  2. {
  3. if(root)
  4. {
  5. visit(root);
  6. preorder(root->left);
  7. preorder(root->right);
  8. }
  9. }
前序非递归 
 
  1. void preorder1(TreeNode *root)
  2. {
  3. stack<TreeNode*> s;
  4. while(root || !s.empty())
  5. {
  6. if(root)
  7. {
  8. visit(root);
  9. s.push(root->right);
  10. root = root->left;
  11. }
  12. else
  13. {
  14. root = s.top();
  15. s.pop();
  16. }
  17. }
  18. }
中序递归
  1. void inorder(TreeNode *root)
  2. {
  3. if(root)
  4. {
  5. inorder(root->left);
  6. visit(root);
  7. inorder(root->right);
  8. }
  9. }
中序非递归
  1. void inorder1(TreeNode *root)
  2. {
  3. stack<TreeNode*> s;
  4. while(root || !s.empty())
  5. {
  6. if(root)
  7. {
  8. s.push(root);
  9. root = root->left;
  10. }
  11. else
  12. {
  13. root = s.top();
  14. s.pop();
  15. visit(root);
  16. root = root->right;
  17. }
  18. }
  19. }
后序递归
  1. void postorder(TreeNode *root)
  2. {
  3. if(root)
  4. {
  5. postorder(root->left);
  6. postorder(root->right);
  7. visit(root);
  8. }
  9. }
后序非递归1,使用双栈
  1. void postorder1(TreeNode *root)
  2. {
  3. stack<TreeNode*> s1;
  4. stack<TreeNode*> s2;
  5. if(!root) return;
  6. s1.push(root);
  7. while(!s1.empty())
  8. {
  9. s2.push(s1.top());
  10. s1.pop();
  11. if(s2.top()->left)
  12. s1.push(s2.top()->left);
  13. if(s2.top()->right)
  14. s1.push(s2.top()->right);
  15. }
  16. while(!s2.empty())
  17. {
  18. visit(s2.top());
  19. s2.pop();
  20. }
  21. }
后序非递归2,使用一个pre指针
  1. void postorder2(TreeNode *root)
  2. {
  3. stack<TreeNode*> s;
  4. TreeNode *pre = NULL;
  5. TreeNode *cur;
  6. if(!root) return;
  7. s.push(root);
  8. while(!s.empty())
  9. {
  10. cur = s.top();
  11. if(!pre || (pre != cur->right && pre != cur->left))
  12. {
  13. if(!cur->left && !cur->right)
  14. {
  15. visit(cur);
  16. s.pop();
  17. pre = cur;
  18. }
  19. if(cur->right)
  20. s.push(cur->right);
  21. if(cur->left)
  22. s.push(cur->left);
  23. }
  24. else if( pre == cur->left)
  25. {
  26. if(cur->right)
  27. s.push(cur->right);
  28. else
  29. {
  30. visit(cur);
  31. s.pop();
  32. pre = cur;
  33. }
  34. }
  35. else if(pre == cur->right)
  36. {
  37. visit(cur);
  38. s.pop();
  39. pre = cur;
  40. }
  41. }
  42. }
层次遍历,使用队列
  1. void level_traversal(TreeNode *root)
  2. {
  3. queue<TreeNode*> q;
  4. if(!root) return;
  5. q.push(root);
  6. while(!q.empty())
  7. {
  8. if(q.front()->left)
  9. q.push(q.front()->left);
  10. if(q.front()->right)
  11. q.push(q.front()->right);
  12. visit(q.front());
  13. q.pop();
  14. }
  15. }

(更新中)

转载于:https://blog.51cto.com/nxlhero/1159213

树的基本操作的非递归实现相关推荐

  1. java非递归遍历file树_Java语言实现非递归实现树的前中后序遍历总结

    前言 三种遍历的递归写法都很好写,所以总结一下非递归写法. 先贴一张图复习一下三种遍历方式就进入正文啦~ [注:本文所有代码实现中树的结点定义如下: public class Node { int v ...

  2. 树:二叉树的非递归遍历算法

    二叉树的递归遍历 二叉树的递归遍历算法,写法很简单,比如说前序遍历树,如下: //前序遍历 void PreOrderTraverse(BiTree tree) {if (NULL != tree){ ...

  3. mysql 实现非递归树_二叉树的非递归前序,中序,后序遍历算法

    #include #include struct tree { char data; struct tree *lchild; struct tree *rchild; }; typedef stru ...

  4. 树的递归与非递归遍历算法

    树的递归与非递归遍历算法 树的递归与非递归遍历算法 树的遍历 实例 树遍历的口诀 树的递归遍历代码 树的先序遍历 树的中序遍历 树的后序遍历 递归遍历思想 树的非递归遍历 树的先序非递归遍历 先序遍历 ...

  5. 非递归式查找树形数据

    给你一棵树,怎么用非递归方式去查找里面满足要求的某些节点? 可以用队列来实现,举例如下: Android界面就是基于一棵树的结构来进行显示的,怎样通过一个ViewGroup,非递归式的找到它下面所有B ...

  6. 二叉树(C++):创建,前中后序遍历(递归+非递归),获取叶子节点个数,获取树的高度

    文章目录 前言 创建二叉树 先序遍历 中序遍历 后序遍历 获取叶子节点个数 获取树的高度 测试代码 前言 现有如下二叉树: 关于二叉树的相关操作,我们能够发现二叉树从根节点到子节点,以及每个中间节点基 ...

  7. python创建树结构、求深度_数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)...

    前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...

  8. 树与二叉树的深度优先与广度优先算法(递归与非递归)

    本博客前面文章已对树与二叉树有过简单的介绍,本文主要是重点介绍有关二叉树的一些具体操作与应用 阅读本文前,可以先参考本博客 各种基本算法实现小结(三)-- 树与二叉树   和  各种基本算法实现小结( ...

  9. 线段树递归和非递归实现+hdu1166 敌兵布阵

    递归代码: #include <string> #include <cstring> #include <iostream> #include <stdio. ...

最新文章

  1. CUDA 7 Stream流简化并发性
  2. 基于Springboot实现园区招商管理系统
  3. 完成动态根据类别动态填充区域颜色
  4. python中的绘图模块turtle的使用
  5. VHDL设计出租车计价器
  6. [2021 CSP-S提高组] 题解(廊桥分配+括号序列+回文+交通规划)
  7. python实例 97,98
  8. [Matlab] 不能在 syms 中假设 symfun 的值域
  9. .net页面生命周期
  10. ios 中NSString的一些调用
  11. 【图像融合】基于matlab IHS图像融合【含Matlab源码 724期】
  12. find命令之xargs
  13. 开关电源三种拓扑的产生
  14. MarkDown 符号大全
  15. 大一期末计算机考试评分标准,大学生平时成绩考核评价标准
  16. 小球弹跳及MATLAB实现
  17. echarts 实现温度计
  18. 制作表情包(python)
  19. VMware虚拟机的安装以及基一些础命令
  20. mysql主备方案_Mysql 主备双库方案

热门文章

  1. cppunit linux,Linux中使用CppUnit工具
  2. springboot定时执行任务
  3. 从网上下载的jar包导入到本地maven库
  4. 有STC制作一个手持微型示波器
  5. 机械爪角度与距离之间的关系
  6. 对比直立车模控制中的互补滤波、Karlman滤波和参考滤波方案
  7. 低内阻的MOS管 4N04R7
  8. 在控制台打印sql语句的办法(MyBatis Log Plugin插件的安装与使用)
  9. php7.2 mysql 教程_如何在PHP7中扩展mysql,先安装php7.2。后安装mysql
  10. 手机虚拟摄像头_没键盘也能打字?三星展示最新虚拟键盘Selfie Type:是真的