遍历二叉树及其递归实现

遍历二叉树

  1. 在二叉树的应用中,常常要求在树中查找具有某种特征的结点,或者对树中的结点逐一进行某种处理,这就出现了一个如何遍历二叉树的问题。
  2. 我们希望能按照某条搜索路径访问树中的每一个结点,并使得每个结点有且仅被访问一次。“访问”的含义很多,可以是对结点作各种处理,如输出结点的信息等。遍历对线性结构来说是一个容易解决的问题,而对于二叉树则不然,由于二叉树是一种非线性结构,它的每个结点都可能有0~2棵子树,因此需要寻求一种规律,使得二叉树上的结点能排列在线性队列上从而便于遍历。
  3. 这里若我们规定遍历时先左后右,则将只有三种情况,即根左右,左根右,左右根,我们依次称为先序遍历,中序遍历,后序遍历。
  4. 如下两图为两个例子,并给出了先序,中序,后序遍历的结果:

  5. 这里先序,中序,后序遍历我用的递归的方式去实现的,举中序为例,其核心代码即为:(左根右的思想)
void inOrder(BiTree& T)
{
	if(T)
	{
		inOrder(T->lchild);
		visit(T->data);
		inOrder(T->rchild);
	}
}
  1. 下面是遍历二叉树的完整实现代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std;

//二叉链表的结点结构 
typedef struct BiTreeNode{
	char data; 					//数据域 
	struct BiTreeNode* lchild;  //左孩子指针域 
	struct BiTreeNode* rchild;  //右孩子指针域 
}BiNode,*BiTree;

void CreateBiTree(BiTree& T);	//初始化添加二叉树信息 
void preOrder(BiTree& T);  		//先序遍历二叉树:根 左 右 
void inOrder(BiTree& T);  		//中序遍历二叉树:左 根 右 
void postOrder(BiTree& T);  	//后序遍历二叉树:左 右 根 

void CreateBiTree(BiTree& T)
{
	char ch;
	cin>>ch;
	if(ch=='#')	T=NULL;
	else
	{
		if(!(T=(BiNode*)malloc(sizeof(BiNode))))  exit(0);
		T->data=ch;
		//这里注意正确输入的顺序 
		CreateBiTree(T->lchild); //先构造左子树 
		CreateBiTree(T->rchild); //再构造右子树 
	}
}

int visit(char data1)
{
	cout<<data1;
	return 0;
}

void preOrder(BiTree& T)
{
	if(T)
	{
		visit(T->data);
		preOrder(T->lchild);
		preOrder(T->rchild);
	}
}

void inOrder(BiTree& T)
{
	if(T)
	{
		inOrder(T->lchild);
		visit(T->data);
		inOrder(T->rchild);
	}
}

void postOrder(BiTree& T)
{
	if(T)
	{
		postOrder(T->lchild);
		postOrder(T->rchild);
		visit(T->data);
	}
}

int main()
{
	//测试用例:
	//ABE##F##C#DG###
	//-+a##*b##-c##d##/e##f##
	BiTree T;
	CreateBiTree(T);
	preOrder(T);
	cout<<endl;
	inOrder(T);
	cout<<endl;
	postOrder(T);
	return 0;
} 

运行结果如下:

发布了77 篇原创文章 · 获赞 19 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42932834/article/details/93784340