二叉树的遍历
在遍历二叉树有四种方法
二叉树的遍历原理
-
二叉树的遍历(traversing binary tree)
-
是指从根节点除法,按照某种次序一次访问二叉树中的所有结点
-
使得每个结点被访问一次 , 且仅被访问一次
-
关键词,访问和次序
-
访问:
- 访问其实是要根据实际的需要来确定具体做什么,比如计算,或者输出
这里的访问算是一个抽象操作,我们简单的假设访问就是输出结点的数据信息
- 访问其实是要根据实际的需要来确定具体做什么,比如计算,或者输出
-
次序:
- 树和线性表的遍历方式不同的,线性表一般是从头到尾,
- 我们限制树的遍历次序,遍历次序是从左至右
二叉树遍历方法
主要有四种- 前序遍历(先序)
规则是若二叉树为空,则空操作返回,否则先访问根节点,然后前序遍历左子树,在前序遍历右子树,-
先输出根,在访问根的左子树,在先序遍历跟的左子树,之后是右子树
-
如下图
-
遍历的顺序为:ABDECFG
-
遍历设计的递归,我们可以理解为对于每一个结点都做了一次函数
-

-
-
中序遍历
- 规则是若树为空,则空操作返回,否则从根节点开始(注意并不是先访问根节点)
中序遍历左子树,然后是访问根节点 ,再中序遍历右子树 - 记住规律,访问根,中序遍历左子树,左子树到头了输出左子树的信息 在输出根的信息
然后在输出根节点的信息,在对右子树做同样的事情- 下图中序遍历输出:DBEAFCG

- 规则是若树为空,则空操作返回,否则从根节点开始(注意并不是先访问根节点)
-
后序遍历
- 规则是若树为空,则空操作返回,否则从左到右先叶子后节点的方式遍
历访问左右子树,- 下图后序遍历输出:DEBFGCA

- 规则是若树为空,则空操作返回,否则从左到右先叶子后节点的方式遍
-
层序遍历
先序生成二叉树
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -1
typedef char ElementTypec ;
typedef struct Tnode * BiTree;
typedef struct Tnode{
ElementTypec data; // 结点值是字符类型
BiTree Left; //左子树的指针
BiTree Right; //右子树的指针
}Tnode;
void CreatBiTree( BiTree* T);
void PreOrderTraverse(BiTree T) ;
int main()
{
BiTree p ;
CreatBiTree(&p);
PreOrderTraverse(p);
return 0 ;
}
void CreatBiTree( BiTree* T) //先序创建二叉树
{
ElementTypec ch;
scanf("%c",&ch);
if( ch =='#')
{
*T = NULL;// 让这个结点指向空
}else{
*T = (BiTree)malloc(sizeof(Tnode)); // T = &p *T = malloc == p = malloc = &Tnode
if(!T)
exit(OVERFLOW);
(*T)->data = ch; //将字符给数据域 生成根节点
CreatBiTree(&(*T)->Left); // 递归调用自己生成左子树
CreatBiTree(&(*T)->Right);// 递归调用自己生成左子树
}
}
void PreOrderTraverse(BiTree T) //先序遍历二叉树
{
if(!T)
return ;
printf("%c",T->data);//先输出根节点
PreOrderTraverse(T->Left); //递归遍历左子树
PreOrderTraverse(T->Right); //递归遍历右子树
}
遍历输出的结果
下图是中序遍历但我用的是前序遍历
前序遍历的结果


374

被折叠的 条评论
为什么被折叠?



