数据结构基础5.1:树的遍历(递归与非递归实现)
来源:互联网 发布:自学cg插画知乎 编辑:程序博客网 时间:2024/05/22 06:05
树的遍历有三种形式:1. 前序遍历 2. 中序遍历 3. 后序遍历。
每种形式的遍历的方式又可以分为递归与非递归两种。
递归遍历中,三种方式递归的路径均相同,区别仅仅是访问结点时间的不同而已。
非递归遍历中,通过栈来实现递归的作用,其中,后序非递归遍历最为复杂,需要记录结点访问次数。
六种遍历方式完整代码如下:
#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <iostream>#include <stack>using namespace std;typedef struct binode{ char ch; struct binode *lchild, *rchild;} *bitree;/* 该结构体用于后序非递归遍历 */typedef struct binode2{ bitree bt2; bool FirstTime;} *bitree2;/* 前序创建树 */void CreatBitree(bitree &bt){ char val; scanf("%c", &val); if(val == ' ') bt = NULL; else { if(!(bt = (bitree)malloc(sizeof(struct binode)))) exit(1); bt->ch = val; CreatBitree(bt->lchild); CreatBitree(bt->rchild); }}/* 前序递归遍历 */void PreOrderTraverse(bitree bt){ if(bt) { printf("%c ", bt->ch); PreOrderTraverse(bt->lchild); PreOrderTraverse(bt->rchild); }}/* 中序递归遍历 */void InOrderTraverse(bitree bt){ if(bt) { InOrderTraverse(bt->lchild); printf("%c ", bt->ch); InOrderTraverse(bt->rchild); } }/* 后序递归遍历 */void PostOrderTraverse(bitree bt){ if(bt) { PostOrderTraverse(bt->lchild); PostOrderTraverse(bt->rchild); printf("%c ", bt->ch); } }/* 前序非递归遍历 */void PreTry(bitree bt){ stack<bitree> s; while(bt != NULL || !s.empty()) { while(bt != NULL) { printf("%c ", bt->ch); s.push(bt); bt = bt->lchild; } if(!s.empty()) { bt = s.top(); s.pop(); bt = bt->rchild; } }}/* 中序非递归遍历 */void InTry(bitree bt){ stack<bitree> s; while(bt != NULL || !s.empty()) { while(bt != NULL) { s.push(bt); bt = bt->lchild; } if(!s.empty()) { bt = s.top(); printf("%c ", bt->ch); s.pop(); bt = bt->rchild; } }}/* 后序非递归遍历 */void PostTry(bitree bt){ stack<bitree2> s; bitree2 btp; bitree2 p; while(bt != NULL || !s.empty()) { while(bt != NULL) { if(!(btp = (bitree2)malloc(sizeof(struct binode2)))) exit(1); btp->bt2 = bt; btp->FirstTime = true; s.push(btp); bt = bt->lchild; } if(!s.empty()) { p = s.top(); s.pop(); if(p->FirstTime == true) { //设置标志位用于记录访问次数 p->FirstTime = false; s.push(p); bt = p->bt2->rchild; } else { printf("%c ", p->bt2->ch);// bt = NULL; } } }}int main(){ bitree bt; CreatBitree(bt); PreOrderTraverse(bt); printf("\n"); PreTry(bt); printf("\n"); InOrderTraverse(bt); printf("\n"); InTry(bt); printf("\n"); PostOrderTraverse(bt); printf("\n"); PostTry(bt); printf("\n"); while(1); return 0;}
0 0
- 数据结构基础5.1:树的遍历(递归与非递归实现)
- 【数据结构】二叉树的遍历(递归与非递归)
- 数据结构--树的三种遍历(递归与非递归实现)
- 【数据结构与算法】二叉树的遍历(递归遍历、非递归遍历、层序遍历)
- 递归与非递归实现树的遍历(java)
- 数据结构与算法学习记录--二叉树的创建,递归遍历,非递归遍历的实现
- [数据结构] 二叉树的递归与非递归遍历
- C语言数据结构实现二叉树递归与非递归遍历(数据结构第四次实验)
- 大话数据结构(七)——二叉树创建与遍历(递归、非递归)的java实现
- Java实现二叉树的递归与非递归遍历
- 二叉树的递归遍历与非递归算法实现
- 二叉树的递归遍历与非递归算法实现
- 递归与非递归实现二叉树的遍历
- 二叉树的递归与非递归遍历实现
- 二叉树遍历的递归与非递归实现
- 二叉树遍历的递归与非递归实现
- 数据结构-前中后序遍历的非递归实现
- 递归非递归实现树的遍历
- 怎样用cmd运行exe控制台程序
- VMware下linux机联网配置
- 去掉 UITableView 顶部的多余空间
- [ecshop调试]ecshop 数据库查询缓存详解 有三种缓存,query_cache(数据库查询缓存)、static_cache(静态缓存)和cache(普通的缓存)
- c++模板函数
- 数据结构基础5.1:树的遍历(递归与非递归实现)
- C语言中,注释不能嵌套
- java编程,格式化数字小数位
- 架构设计最佳实践与必备素养
- 算法-排序-选择排序(直接选择和堆排序)
- 检测亚像素级角点
- GDB 使用入门
- Android进阶之_实现滑动的7种方式详解
- IOS7以上的UITableView顶部空白的问题