以下所有的描述都以这棵树为基础。
二叉树的链式存储结构
二叉树中的每一个节点用链表中的一个节点来存储,节点类型声明如下:
typedef struct treeNode
{
DataType data; //数据元素
struct treeNode* lchild; //指向左孩子节点
struct treeNode* rchild; //指向右孩子节点
}*TreeNode, Tree;
生成二叉树
1、前序序列生成方法
采用输入前序序列的方式生成二叉树,但这里的前序序列并不等同于前序遍历。因为计算机需要知道哪些节点是空白节点,所以应该按下面的方式输入前序序列。用代表空白的节点,于是输入的前序序列是:ABD*G***CE**F*
//创建二叉树,用*填充空节点
void CreateTree(Tree **T)
{
char ch;
cin>>ch;
if(ch == '*')
*T = NULL;
else
{
*T = (Tree*)malloc(sizeof(Tree));
(*T)->data = ch;
CreateTree(&(*T)->lchild);
CreateTree(&(*T)->rchild);
}
}
2、层序生成二叉树
很多建立二叉树都是用先序,中序或者后序建立,不过这就要求输入时要自己先想出相应的序列。真的是太麻烦了,亲身经历,快要泪奔了。想实现个二叉树的相关方法,测试不同类型的树的输出真的好累。因此不得设法实现层序生成二叉树的方法。
//创建二叉树,用*填充空节点,逐层建立
//按层输入二叉树,虚结点输入'*'(结束符为'@')
void CreateTreeLayer(Tree **T, char *str)
{
if(str == NULL)
return;
queue<Tree*> nodes;
Tree *p;
Tree *f = NULL;
int front = 0, rear = 0;
while(*str != '\n')
{
if(*str == '@')
break;
p = NULL;
if(*str != '*')
{
p = (Tree*)malloc(sizeof(Tree));
p->data = *str;
p->lchild = p->rchild = NULL;
}
nodes.push(p);
rear++;
if(rear ==