二叉树的建立与遍历(前序,中序,后序)

本文介绍了二叉树的基本概念,包括定义和链式存储结构,重点讨论了二叉链表的节点结构。文章还详细讲解了二叉树的三种遍历方式——前序遍历、中序遍历和后序遍历,并提供了前序遍历的具体例子。通过阅读,读者可以理解二叉树遍历的原理和应用。

二叉树(Binary Tree)

定义:二叉树是n(n>=0)个结点的优先集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。

链式存储结构(二叉链表):由一个数据域(data)和两个指针域构成(lchild,rchild分别指向左右孩子)。如下图:


例如:


二叉链表的结点结构定义代码

typedef struct BiTNode  /* 结点结构 */
{
   TElemType data;		/* 结点数据 */
   struct BiTNode *lchild,*rchild; /* 左右孩子指针 */
}BiTNode,*BiTree;
二叉树遍历(traversing binary tree):

是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且被访问一次。

遍历方法有前序遍历,中序遍历,后序遍历。

前序遍历规则:若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,在前序遍历右子树。如下图,前序遍历结果为:ABDGHCEIF。


前序遍历实现代码
void PreOrderTraverse(BiTree T)
{ 
	if(T==NULL)
		return;
	printf("%c",T->data);/* 显示结点数据,可以更改为其它对结点操作 */
	PreOrderTraverse(T->lchild); /* 再先序遍历左子树 */
	PreOrderTraverse(T->rchild); /* 最后先序遍历右子树 */
}
中序遍历规则:若二叉树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树。如下图中序遍历结果为:GDHBAEICF。

中序遍历代码实现:
void InOrderTraverse(BiTree T)
{ 
	if(T==NULL)
		return;
	InOrderTraverse(T->lchild); /* 中序遍历左子树 */
	printf("%c",T->data);/* 显示结点数据,可以更改为其它对结点操作 */
	InOrderTraverse(T->rchild); /* 最后中序遍历右子树 */
}
后序遍历规则:若二叉树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点。如下图,后序遍历结果为:GHDBIEFCA。

后序遍历代码实现:
void PostOrderTraverse(BiTree T)
{
	if(T==NULL)
		return;
	PostOrderTraverse(T->lchild); /* 先后序遍历左子树  */
	PostOrderTraverse(T->rchild); /* 再后序遍历右子树  */
	printf("%c",T->data);/* 显示结点数据,可以更改为其它对结点操作 */
}
二叉树的建立:
下面利用前序输入树中结点的值,递归来建立二叉树,最后利用前序遍历输出来验证二叉树是否构建成功。
例如建立如下图的二叉树:


为了确定每个结点是否有左右孩子,我们对其进行扩展,利用“#”表示空指针引出的虚结点,则扩展二叉树如下:


对扩展二叉树进行前序遍历,AB#D##C##。
c++实现:
#include <iostream>

using namespace std;
typedef struct node  
{  
    struct node *lchild;  
    struct node *rchild;  
    char data;  
}BiTreeNode, *BiTree;
//按前序输入二叉树中结点的值
//构造二叉树表表示二叉树T
void CreateBiTree(BiTree &T)
{
	char ch;
	cin>>ch;

	if(ch=='#') 
		T=NULL;
	else
	{
		T= new BiTreeNode;
		if(!T) exit(0);
		T->data=ch; 
		CreateBiTree(T->lchild);  
		CreateBiTree(T->rchild); 
	}
}
//前序递归遍历二叉树
void PreOrderTraverse(BiTree &T)
{   
	if(T)//当结点不为空的时候执行
	{  
		cout<<T->data;  
		PreOrderTraverse(T->lchild);//  
		PreOrderTraverse(T->rchild);  
	}  
	else cout<<"";  
}
int main()
{
	BiTree T;
	cout<<"输入对扩展二叉树的前序遍历序列:"<<endl;

	CreateBiTree(T);

	cout<<"输出前序遍历结果:"<<endl;

	PreOrderTraverse(T);
	cout<<endl;

	return 0;
}
测试结果:




参考: 
  • 大话数据结构
  • 《算法导论》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值