数据结构学习笔记(7)---二叉树递归与非递归遍历
来源:互联网 发布:仿真软件proteus下载 编辑:程序博客网 时间:2024/06/11 06:04
对与二叉树的便遍历有递归遍历与非递归遍历,递归遍历理解起来较简单,容易理解,代码书写简单,但是效率比较低下,对于非递归算法,虽然效率较高但是代码相对对一,且不是那么好容易理解,下面就进行一一解释
数据结构
typedef struct Tree{ int date; struct Tree* lchild; struct Tree * rchild;}BiTree,*PBiTree;
(1)链表的先序递归遍历
void PreOrder(PBiTree root){ if (root != NULL) { cout << root->date; PreOrder(root->lchild); PreOrder(root->rchild); }}
(2)链表的非递归先序遍历
void PreOrderPush(PBiTree root){ stack<PBiTree> s; if (root == NULL) { return; } while (root != NULL || !s.empty() ) { if (root) { cout << root->date; s.push(root); root = root->lchild; } else { PBiTree p = s.top(); s.pop(); root = p->rchild; } }}
(3)链表的中序递归遍历
void InOrder(PBiTree root){ if (root != NULL) { InOrder(root->lchild); cout << root->date; InOrder(root->rchild); }}
(5)链表的非递归中序遍历
void InOrderPush(PBiTree root){ stack<PBiTree> s; if (root == NULL) { return; } while (root != NULL || !s.empty()) { if (root) { s.push(root); root = root->lchild; } else { PBiTree p = s.top(); cout << p->date; s.pop(); root = p->rchild; } }}
(6)链表的递归后序遍历
void PostOrder(PBiTree root){ if (root != NULL) { PostOrder(root->lchild); PostOrder(root->rchild); cout << root->date; }}
(7)链表的非递归后续遍历, 前两种非递归比较简单,在此只介绍后序非递归遍历的思路:
(1)首先只有当二叉树的节点不为空并且栈不为空时才能继续进行遍历
(2)然后沿着二叉树的左孩子一直进行压栈,直到左孩子为空
(3)这时候需要取得栈顶元素观察其右孩子是否为空 如果为空既可以输出弹出顶元素,并输出数据。
(4)否则就把其右孩当做子树根节点重复上述操作,但是刚才为了简单解释,没有说明当第三走时,只判断为空是不准的,如果不为空但是其右孩子已经遍历完了也应该输出数据这时就需要一个指针记录还节点的右孩子是否已经输出
void PostOrderPush(PBiTree root){ stack<PBiTree> s; PBiTree p, q; p = root; q = NULL;//上一个节点 while (p != NULL || !s.empty()) {//先遍历左子树 while (p != NULL) { s.push(p); p = p->lchild; } if (!s.empty()) { p = s.top(); //如果没有右子树,或者右子树刚刚被访问过,则输出根节点 if (p->rchild == NULL || p->rchild == q) { cout << p->date; q = p; s.pop(); p = NULL; } else { p = p->rchild; } } }}
以上就是我的遍历书写是的代码,感觉对于二叉树的遍历也不是那么难,递归方法最好理解
阅读全文
0 0
- 数据结构学习笔记(7)---二叉树递归与非递归遍历
- 【数据结构】二叉树的遍历(递归与非递归)
- 【数据结构与算法】二叉树的遍历(递归遍历、非递归遍历、层序遍历)
- 【数据结构与算法】二叉树递归与非递归遍历
- [数据结构] 二叉树的递归与非递归遍历
- 【数据结构】递归与非递归法遍历二叉树
- 数据结构与算法学习记录--二叉树的创建,递归遍历,非递归遍历的实现
- 【数据结构与算法】二叉树深度遍历(非递归)
- 【学习笔记】二叉树非递归遍历
- 数据结构与算法分析学习笔记--第四章(二叉树:创建、递归遍历、非递归遍历、根据数据删除结点等)
- 数据结构学习笔记-二叉树的前、中、后序遍历,递归、非递归方式
- 数据结构之二叉树遍历(递归和非递归)
- 数据结构学习笔记(三)二叉树的非递归遍历
- C语言数据结构实现二叉树递归与非递归遍历(数据结构第四次实验)
- 二叉树 递归 与 非递归 遍历
- 递归与非递归二叉树遍历
- 二叉树递归与非递归遍历
- 二叉树递归与非递归遍历
- C#中交换两个数的值
- 微服务架构中 API 的开发与治理
- spring boot Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @Spr
- tomcat启动访问指定目录
- CDH HBASE使用solr创建二级索引,更新删除索引
- 数据结构学习笔记(7)---二叉树递归与非递归遍历
- markdown写法,持续更新
- GitHub代码管理学习之路(三)
- 重排数列
- java NIO BIO和AIO
- Redis.conf配置文件
- E. Anya and Cubes (CF #297 (Div. 2) 折半搜索)
- 3GPP
- cocos2dx3.10在Android平台,出现错误org.apache.http不存在