3、二叉树的建立
如果要在内存中建立一个如下左图这样的树,wield能让每个结点确认是否有左右孩子,我们对它进行扩展,变成如下右图的样子,也就是将二叉树中的每个结点的空指针引出一个虚结点,其值为一个特定值,比如”#”,称之为扩展二叉树。扩展二叉树就可以做到一个遍历序列确定一棵二叉树了。如前序遍历序列为AB#D##C##。
有了这样的准备,就可以看看如何生成一棵二叉树了。假设二叉树的结点均为一个字符,把刚才前序遍历序列AB#D##C##用键盘挨个输入,实现的算法如下所示。
#include <cstdio>
#include <cstdlib>
//#define _OJ_
typedef struct tree
{
char data;
struct tree *lchild;
struct tree *rchild;
} tree, *bitree;
/*bitree
init_tree(void)
{
bitree T;
T = (bitree) malloc (sizeof(tree));
T->lchild = NULL;
T->rchild = NULL;
}*/
bitree
creat_tree(bitree T)
{
char ch;
scanf("%c", &ch);
if(ch == '#')
T = NULL;
else
{
T = (bitree) malloc (sizeof(tree));
T->data = ch;
T->lchild = creat_tree(T->lchild);
T->rchild = creat_tree(T->rchild);
}
//同理可得中,后序创立二叉树只要把以上三个操作换一下顺序而已!!!
return T;
}
void
trverse(bitree T)
{
if(T)
{
printf("%c
", T->data);
trverse(T->lchild);
trverse(T->rchild);
}//同理可得中,后序遍历二叉树只要把以上三个操作换一下顺序而已!!!
}
int main(int argc, char const *argv[]) {
#ifndef _OJ_ //ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
bitree T;
T = creat_tree(T);
trverse(T);
return 0;
}