二叉树的遍历
来源:互联网 发布:开源软件是什么 编辑:程序博客网 时间:2024/06/04 15:40
二叉树的遍历,根据根节点位置的不同,可分为前序遍历(PreOrder)、中序遍历(MidOrder)和后序遍历(PostOrder)。所谓的前、中、后,指的是根所在的位置。以前序遍历为例,根与左右子树的输出次序为:根、左、右。
二叉树对应的结构体类型如下:
<pre name="code" class="cpp">typedef struct node{int data; //数据域struct node *left; //左孩子指针struct node *right; //右孩子指针}BiTree;
下面介绍前序遍历的方法:
1、递归实现
void PreOrder(BiTree *tp){if(tp==NULL)//节点为空return;else{printf("%5d",tp->data);//输出根节点.就三句代码。如果把这句放到中间,那就是中序遍历;放到最后,就是后序遍历PreOrder(tp->left);//前序遍历左子树PreOrder(tp->right);//前序遍历右子树}}
说明 :因为树的定义就是递归的,用递归方法遍历,十分地简明易懂,但效率却不高,要是面试的时候,通常会被要求写非递归方法,因此掌握下面的遍历方法十分必要
2、非递归方法实现
//其实递归调用是要用到栈的(隐式的)。不使用函数递归的调用,就得显式地使用栈。可以自己定义一个一维数组,作栈用。
void PreOrder(BiTree *tp){BiTree *p;//工作指针,用于遍历BiTree *stack[MAXSIZE];//栈定义,其实就是个指针数组,用于存放指针变量。具体大小看个人情况吧,就不写具体数字了int top=-1;//定义并初始化栈顶指针 if(tp==NULL)//同样地,要判断输入节点是否为空<span style="white-space:pre"></span>return ; else { top++; stack[top]=tp; while(top>-1) { p=stack[top]; top--; printf("%5d",p->data); if(p->right) { top++; stack[top]= p->right; } if(p->left) { top++; stack[top]=p->left; }//这里关键是栈是先进后出的,则想要让右子树后打印,就得让右子树先入栈 }//while }//else}//至于中序遍历、后序遍历,就自己动下脑筋,写出来吧。
0 0
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- android 二维码简化,实现仿qq扫描效果
- Qt: 隐藏菜单QMenu
- 农历转换函数
- IT笔试面试常见题型及答案整理
- struts的国际化
- 二叉树的遍历
- 可停靠控件及工具栏(Dock Widgets and Toolbars)
- 安卓Selector
- 截屏,裁剪图片,缩放图片
- phoenix access hbase
- 敏捷软件开发——重构篇
- codeforces 461B Appleman and Tree
- DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之3: Chap5: Timing, Direct Input, and Animation and Sprites
- struts的文件上传