二叉树的先序遍历------零基础学数据结构讲座
来源:互联网 发布:查看手机当前网络dns 编辑:程序博客网 时间:2024/05/23 00:00
如果二叉树为空,则执行空操作。如果二叉树非空,则执行以下操作:
(1)访问根结点。
(2)先序遍历左子树。
(3)先序遍历右子树。
在二叉树先序的遍历过程中,对每一棵二叉树重复执行以上的递归遍历操作,就可以得到先序序列。例如,在遍历根结点A的左子树{B,D,E,G,H,I}时,根据先序遍历的递归定义,先访问根结点B,然后遍历B的左子树为{D,G},最后遍历B的右子树为{E,H,I}。访问过B之后,开始遍历B的左子树{D,G},在子树{D,G}中,先访问根结点D,因为D没有左子树,所以遍历其右子树,右子树只有一个结点G,所以访问G。B的左子树遍历完毕,按照以上方法遍历B的右子树。最后得到结点A的左子树先序序列:B、D、G、E、H、I。
依据二叉树的先序递归定义,可以得到二叉树的先序递归算法。void PreOrderTraverse(BiTree T)/*先序遍历二叉树的递归实现*/{ if(T) /*如果二叉树不为空*/ { printf(“%2c”,T->data); /*访问根结点*/ PreOrderTraverse(T->lchild); /*先序遍历左子树*/ PreOrderTraverse(T->rchild); /*先序遍历右子树*/ }}
二叉树的先序遍历非递归算法实现如下。
void PreOrderTraverse(BiTree T)
/*先序遍历二叉树的非递归实现*/
{
BiTree stack[MaxSize]; /*定义一个栈,用于存放结点的指针*/
int top; /*定义栈顶指针*/
BitNode *p; /*定义一个结点的指针*/
top=0; /*初始化栈*/
p=T;
while(p!=NULL||top>0)
{
while(p!=NULL) /*如果p不空,访问根结点,遍历左子树*/
{
printf(“%2c”,p->data); /*访问根结点*/
stack[top++]=p; /*将p入栈*/
p=p->lchild; /*遍历左子树*/
}
if(top>0) /*如果栈不空*/
{
p=stack[--top]; /*栈顶元素出栈*/
p=p->rchild; /*遍历右子树*/
}
}
}
以上算法是直接利用数组来模拟栈的实现,当然也可以定义一个栈类型实现。如果用第四章的链式栈实现,需要将数据类型改为指向二叉树结点的指针类型。
- 二叉树的先序遍历------零基础学数据结构讲座
- 二叉树的中序遍历--------零基础学数据结构讲座(2)
- 【数据结构】二叉树的先序遍历
- 数据结构练习题---先序遍历二叉树
- 数据结构练习题---先序遍历二叉树
- 数据结构练习题---先序遍历二叉树
- 数据结构之 非递归方法先序遍历二叉树
- 数据结构练习题——先序遍历二叉树
- 【数据结构】扩充先序遍历创建二叉树
- 数据结构--二叉树的遍历--统计二叉树中叶子结点的个数(先序遍历)
- 二叉树的先序遍历
- 二叉树的先序遍历
- 求二叉树的先序遍历
- 求二叉树的先序遍历
- 求二叉树的先序遍历
- 求二叉树的先序遍历
- 求二叉树的先序遍历
- 求二叉树的先序遍历
- Strive for Life 为生活而奋斗
- 写了一个小游戏 还可以
- 每天更新 一些小代码
- 怎么上传不了附件啊
- 博客上线!!
- 二叉树的先序遍历------零基础学数据结构讲座
- 二叉树的中序遍历--------零基础学数据结构讲座(2)
- 将HTML表格导入到Excel
- C,C++,C#
- 我们爱编程
- C++类构造函数初始化列表
- C++虚函数及虚函数表解析代码
- csdn对我的帮助
- 第一篇日记