数据结构-二叉树的创建?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-二叉树的创建?相关的知识,希望对你有一定的参考价值。
如果要在内存中建立一个如下左图这样的树,wield能让每个结点确认是否有左右孩子,我们对它进行扩展,变成如下右图的样子,也就是将二叉树中的每个结点的空指针引出一个虚结点,其值为一个特定值,比如”#”,称之为扩展二叉树。扩展二叉树就可以做到一个遍历序列确定一棵二叉树了。如前序遍历序列为AB#D##C##。
有了这样的准备,就可以看看如何生成一棵二叉树了。假设二叉树的结点均为一个字符,把刚才前序遍历序列AB#D##C##用键盘挨个输入,实现的算法如下所示。
二叉树建立实现代码一,如下所示。
//创建树//按先后次序输入二叉树中结点的值(一个字符),#表示空树
//构造二叉链表表示的二叉树
BiTree CreateTree(BiTree t)
char ch;
scanf("%c", &ch);
if(ch == '#')
t = NULL;
else
t = (BitNode *)malloc(sizeof(BitNode));
if(t == NULL)
fprintf(stderr, "malloc() error in CreateTree.\\n");
return;
t->data = ch; //生成根结点
t->lchild = CreateTree(t->lchild); //构造左子树
t->rchild = CreateTree(t->rchild); //构造右子树
return t;
二叉树建立实现代码二,如下所示。
//创建树方法二int CreateTree2(BiTree *t)
char ch;
scanf("%c", &ch);
if(ch == '#')
(*t) = NULL;
else
(*t) = (BiTree)malloc(sizeof(BitNode));
if((*t) == NULL)
fprintf(stderr, "malloc() error in CreateTree2.\\n");
return ERROR;
(*t)->data = ch;
CreateTree2(&((*t)->lchild));
CreateTree2(&((*t)->rchild));
return OK;
其实建立二叉树,也是利用了递归的原理。只不过在原来应该打印结点的地方,改成生成结点、给结点赋值的操作而已。因此,完全可以用中序或后序遍历的方式实现二叉树的建立,只不过代码里生成结点和构造左右子树的代码顺序交互一下即可。
参考技术A #include <stdio.h>#define ElemType char
//节点声明,数据域、左孩子指针、右孩子指针
typedef struct BiTNode
char data;
struct BiTNode *lchild,*rchild;
BiTNode,*BiTree;
//先序建立二叉树
BiTree CreateBiTree()
char ch;
BiTree T;
scanf('%c',&ch);
if(ch=='#')T=NULL;
else
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
T->lchild = CreateBiTree();
T->rchild = CreateBiTree();
return T;//返回根节点
//先序遍历二叉树
void PreOrderTraverse(BiTree T)
if(T)
printf('%c',T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
//中序遍历
void InOrderTraverse(BiTree T)
if(T)
PreOrderTraverse(T->lchild);
printf('%c',T->data);
PreOrderTraverse(T->rchild);
//后序遍历
void PostOrderTraverse(BiTree T)
if(T)
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
printf('%c',T->data);
void main()
BiTree T;
T = CreateBiTree();//建立
PreOrderTraverse(T);//输出
getch();
本回答被提问者和网友采纳
以上是关于数据结构-二叉树的创建?的主要内容,如果未能解决你的问题,请参考以下文章