二叉树遍历的方法

参考

  1. 《大话数据结构》
  2. 本笔记仅作学习记录使用

1. 前序遍历

规则:按照先访问根,再访问左子树,最后访问右子树的方式(根->左->右)
在这里插入图片描述

// 前序遍历
void PreOrderTraverse(BiTree T)
{
    
    
	if(T==NULL)
		return ;
	printf("%c",T->data); // 显示结点数据,也可以是其他操作
	PreOrderTraverse(T->lchild);
	PreOrderTraverse(T->rchild); 
} 

访问顺序:ABDGHCEIF

中序遍历

规则:按照先访问左子树,然后根结点(是指当前子树的根结点,而不是整棵树的根节点),最后右子树(左->根->右)

如该图中,黄色框图标记的这棵子树中,D 就是该子树的根结点
在这里插入图片描述

// 中序遍历 
void InOrderTraverse(BiTree T)
{
    
    
	if(T==NULL)
		return ;
	InOrderTraverse(T->lchild);
	printf("%c",T->data);
	InOrderTraverse(T->rchild);
} 

访问顺序:GDHBAEICF

后续遍历

规则:按照先左子树,然后右子树,最后根结点(依然是当前子树的根结点)的顺序(左->右->根)
在这里插入图片描述

// 后序遍历
void PostOrderTraverse(BiTree T)
{
    
    
	if(T==NULL)
		return ;
	PostOrderTraverse(T->lchild);
	PostOrderTraverse(T->rchild);
	printf("%c",T->data);
} 

访问顺序:GHDBIEFCA

其实,所谓的前,中,后序,是指根被访问的次序。如前序,根就第一个被访问,中序,根就第二个被访问。

层序遍历

层序遍历就是从跟结点开始,逐层,每层从左至右扫描。
在这里插入图片描述

访问顺序:ABCDEFGHL

void LevelOrder(BiTree b)
{
    
     
	InitQueue(Q); 
	BiTree p; 
	EnQueue(Q,b); //根结点进队 
	while(IsEmpty(Q))
	{
    
               
	//队列不空循环 
	DeQueue(Q,p) 
	//队头元素出队 
	printf(%c”,p->data); 
	if(p->lchild!=NULL) 
	EnQueue(Q,p->lchild); 
	if(p->rchild!=NULL) 
	EnQueue(Q,p->rchild); 
	} 
}

**note

  1. 层序遍历在算法思想上和图的广度优先遍历很类似**

猜你喜欢

转载自blog.csdn.net/qq_34902437/article/details/94012432
今日推荐