题目描述
1.设一棵二叉树的先序、中序遍历序列为:先序遍历序列,ABDFCEGH、 中序遍历序列,BFDAGEHC。
求:
(1) 写出其后序遍历序列;
(2) 并画出它的后序线索二叉树。
具体讲解
先画出遍历序列,后根据遍历序列例如ABC,看A的右子树是否为空,如果为空,则指向B,再看B,如果B的左子树为空,则指向A,依次类推,均符合这个规律。
当然,我们也可以引入代码进行调试、运行。
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
#define MAXSIZE 100
//*二叉树数据结构定义*
typedef struct BiTreeNode
{
char data;
struct BiTreeNode* left;
struct BiTreeNode* right;
}BiTreeNode, * BiTree;
//*二叉树的建立--按照先序方式建立--插入*
void CreateBiTree(BiTree* T)
{
char val;
scanf("%c", &val);
if (val == '#')
*T = NULL; //null表示为空枝
else
{
*T = (BiTree)malloc(sizeof(BiTreeNode));
(*T)->data = val;
CreateBiTree(&(*T)->left);
CreateBiTree(&(*T)->right);
}
}
//*先序遍历 根左右*
void PreOrderTravel(BiTree T)
{
if (T == NULL)
return;
printf("%c ", T->data);
PreOrderTravel(T->left);
PreOrderTravel(T->right);
}
//*中序遍历 左根右*
void InOrderTravel(BiTree T)
{
if (T == NULL)
return;
InOrderTravel(T->left);
printf("%c ", T->data);
InOrderTravel(T->right);
}
//*后序遍历 左右根*
void TailOrderTravel(BiTree T)
{
if (T == NULL)
return;
TailOrderTravel(T->left);
TailOrderTravel(T->right);
printf("%c ", T->data);
}
int main()
{
BiTree T;
T = (BiTree)malloc(sizeof(BiTreeNode));
printf("请给二叉树按照先序方式依次输入结点的值(空结点为#):\n");
CreateBiTree(&T);
printf("先序方式遍历结果:\n");
PreOrderTravel(T);
printf("\n");
printf("中序方式遍历结果:\n");
InOrderTravel(T);
printf("\n");
printf("后序方式遍历结果:\n");
TailOrderTravel(T);
printf("\n");
return 0;
}
根据题中所给的先、中序遍历序列,可得二叉树的表示为:
若按照先序输入方式一次输入节点的值(空结点为#),
则输入为:
AB#DF###CEG##H###
将该输入带进程序调试、运行,得如下结果。
所以其后序遍历序列为:
FDBGHECA
根据后序遍历序列,即可画出后续线索二叉树。
答案演示
(1)后序序列:FDBGHECA
(2)
最后的话
作为一个初学者,对于这方面的知识难免不是很牢固。如果有什么错误,还请各位老铁,能够指出。