二叉树的遍历
先序遍历 :
中序遍历 :
后序遍历 :
emmmm如果你看不懂的话,你可以先这样,首先将这个二叉树的左边补全!!!一定是左边,因为根据遍历顺序而来的!!!相信我
然后跟我的GIF图走一遍
先序遍历
中序遍历
后序遍历
找找规律,因为二叉树是一个嵌套的结构(比如说 结点,既是 的左子树,又作为+的根结点),所以有着这种遍历的规律。
写一下遍历过程,关于中序遍历:
中序遍历的遍历过程是“左根右”,首先从最左面的结点开始,发现这个结点不存在,为方便起见,我们把它填补上。
- 左根右:
空(左) A (根)空(右) - 左根右:
空A空(左) + (根) BXC (右) - 左根右:
空A空+ BXC (左) — (根) D 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;
}
输入样例
别复制,按这个顺序输入一遍,复制会乱码!
输出样例
先序遍历:
中序遍历:
后序遍历: