数据结构(C语言)关于二叉树的递归遍历

二叉树的遍历

先序遍历 + A × B C ÷ D E -+A\times BC \div DE

中序遍历 A + B × C D ÷ E A+B\times C-D\div E

后序遍历 A B C × + D E ÷ ABC\times +DE\div-

emmmm如果你看不懂的话,你可以先这样,首先将这个二叉树的左边补全!!!一定是左边,因为根据遍历顺序而来的!!!相信我

然后跟我的GIF图走一遍

先序遍历

中序遍历

后序遍历

找找规律,因为二叉树是一个嵌套的结构(比如说 + + 结点,既是 - 的左子树,又作为+的根结点),所以有着这种遍历的规律。

写一下遍历过程,关于中序遍历:
中序遍历的遍历过程是“左根右”,首先从最左面的结点开始,发现这个结点不存在,为方便起见,我们把它填补上。

  1. 左根右: (左) A (根) (右)
  2. 左根右: A (左) + (根) BXC (右)
  3. 左根右: A + BXC (左) (根) D ÷ \div E (右)

如果实在看不懂就按这种方法进行,然后找规律,后续再做就快了!

先序遍历代码(递归)

Status PreOrderTraverse(BiTree T)
{
	if (T == NULL)
		return OK;
	else
	{
		visit(T);//访问根节点
		PreOrderTraverse(T->lchild);//递归遍历左子树
		PreOrderTraverse(T->rchild);//递归遍历右子树
	}
}//PreOrderTraverse

中序遍历代码(递归)

Status InOrderTraverse(BiTree T)
{
	if (T == NULL)
		return OK;//空二叉树
	else
	{
		InOrderTraverse(T->lchild);//递归遍历左子树
		visit(T);//访问根节点
		InOrderTraverse(T->rchild);//递归遍历右子树
	}
	return OK;
}//InOrderTraverse

后序遍历代码(递归)

Status PostOrderTraverse(BiTree T)
{
	if (T == NULL)
		return OK;
	else
	{
		PostOrderTraverse(T->lchild);//递归遍历左子树
		PostOrderTraverse(T->rchild);//递归遍历右子树
		visit(T);//访问根节点
	}
	return OK;
}//PostOrderTraverse
访问结点数据代码visit()
void visit(BiTree T)
{
	printf("%c ", T->data);
}//visit

遍历完整代码

#pragma warning(disable:4996)
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

//Status是函数的类型,其值是函数结果状态代码
typedef int Status;
typedef char TElemType;

typedef struct BiNode {
	TElemType data;
	struct BiNode* lchild, * rchild;//左右孩子指针
}BiTNode,*BiTree;

Status CreateBiTree(BiTree& T);
//按先序次序输入二叉树中结点的值(一个字符),@字符表示空树
//构造二叉链表表示的二叉树T
Status PreOrderTraverse(BiTree T);
//先序遍历
Status InOrderTraverse(BiTree T);
//中序遍历
Status InOrderTraverse(BiTree T);
//后序遍历
void visit(BiTree T);
//输出根节点的值

Status CreateBiTree(BiTree& T)
{
	char ch;
	scanf("%c",&ch);
	if (ch == '@')
		T = NULL;
	else 
	{
		T = ((BiTNode*)malloc(sizeof(BiTNode)));
		if (!(T = (BiTNode*)malloc(sizeof(BiTNode))))
			exit(OVERFLOW);
		T->data = ch;
		CreateBiTree(T->lchild);//构造左子树
		CreateBiTree(T->rchild);//构造右子树
	}
	return OK;
}//CreateBiTree
Status PreOrderTraverse(BiTree T)
{
	if (T == NULL)
		return OK;
	else
	{
		visit(T);//访问根节点
		PreOrderTraverse(T->lchild);//递归遍历左子树
		PreOrderTraverse(T->rchild);//递归遍历右子树
	}
}//PreOrderTraverse

Status InOrderTraverse(BiTree T)
{
	if (T == NULL)
		return OK;//空二叉树
	else
	{
		InOrderTraverse(T->lchild);//递归遍历左子树
		visit(T);//访问根节点
		InOrderTraverse(T->rchild);//递归遍历右子树
	}
	return OK;
}//InOrderTraverse

Status PostOrderTraverse(BiTree T)
{
	if (T == NULL)
		return OK;
	else
	{
		PostOrderTraverse(T->lchild);//递归遍历左子树
		PostOrderTraverse(T->rchild);//递归遍历右子树
		visit(T);//访问根节点
	}
	return OK;
}//PostOrderTraverse

void visit(BiTree T)
{
	printf("%c ", T->data);
}//visit

int main()
{
	BiTree T;
	CreateBiTree(T);
	printf("先序遍历:");
	PreOrderTraverse(T);
	printf("\n中序遍历:");
	InOrderTraverse(T);
	printf("\n后序遍历:");
	PostOrderTraverse(T);
	return 0;
}
输入样例

+ A @ @ B @ @ C @ @ / D @ @ E @ @ -+A@@*B@@C@@/D@@E@@

别复制,按这个顺序输入一遍,复制会乱码!

输出样例

先序遍历: + A B C / D E - + A * B C / D E
中序遍历: A + B C D / E A + B * C - D / E
后序遍历: A B C + D E / A B C * + D E / -

猜你喜欢

转载自blog.csdn.net/qq_44864262/article/details/107170023