一、二叉树的遍历
一棵二叉树由根结点、左子树和右子树三部分组成,因此依次遍历三部分可以遍历整个二叉树。若用D、L、R分别访问二叉树的根结点、左子树和右子树,遍历方式有DLR、LDR、LRD、DRL、RDL、RLD六种。这里先访问左子树再访问右子树。
有三种
先序遍历:DLR
中序遍历:LDR
后序遍历:LRD
#include<stdio.h>
#include<malloc.h>
typedef int TElemtype;
typedef struct BiTNode
{
TElemtype data;
struct BiTNode *leftchild, *rightchild;
}BiTNode, *BiTree;
//创建二叉树
BiTree creatBiTree()
{
BiTree T;
TElemtype e;
scanf("%d",&e);
if (e == 0)
{
T = NULL;
}
else
{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = e;
T->leftchild = creatBiTree();
T->rightchild = creatBiTree();
}
return T;
}
//先序遍历
void PreOrderTraverse(BiTree T)
{
if (T == NULL)
{
return;
}
printf("%d", T->data);
PreOrderTraverse(T->leftchild);
PreOrderTraverse(T->rightchild);
}
//中序遍历
void InOrderTraverse(BiTree T)
{
if (T == NULL)
{
return;
}
InOrderTraverse(T->leftchild);
printf("%d", T->data);
InOrderTraverse(T->rightchild);
}
//后序遍历
void PostOrderTraverse(BiTree T)
{ if (T == NULL)
{
return;
}
PostOrderTraverse(T->leftchild);
PostOrderTraverse(T->rightchild);
printf("%d", T->data);
}
int main()
{ BiTree T;
printf("建立二叉树:");
T=creatBiTree();
printf("先序遍历:");
PreOrderTraverse(T);
printf("\n");
printf("中序遍历:");
InOrderTraverse(T);
printf("\n");
printf("后序遍历:");
PostOrderTraverse(T);
printf("\n");
}
//1 2 4 0 5 0 0 6 0 0 3 7 0 0 8 0 0
二、已知前序和中序遍历,求后序遍历
以上面的二叉树为例子。
前序遍历为:12456378
中序遍历为:45261738
1.由前序遍历可知1为根结点,由中序遍历可知道4526为左子树,738为右子树。
2.由前序遍历可知2为左子树的根结点,3为右子树的根结点。
3.再由中序遍历可知4或5为左子树的左结点,6为左子树右结点,再看前序遍历,4为左子树的左结点,所以5就为4的右结点。
4.同理遍历右子树,由中序遍历,7为3的左结点,8为3的右结点。
可以得到下面的二叉树
后序遍历就为 5 4 6 2 7 8 3 1