在学习数据结构的过程中,二叉树是一个绕不过去的问题,关于二叉树我们不仅要了解二叉树如何建立,也要了解二叉树如何进行遍历,在一些acm或者某些学校的考研复试机试中可能会涉及到二叉树。
我们在解题或者实际应用过程中,首先会按照先序序列去建立二叉树,其过程在各大数据结构的书籍中不尽相同,应该是这样的。
typedef struct BTNode{
char data;
struct BTNode *lchild.*rchild;
}BTNode,BiTree;
void CreateBiTree(BiTree &T) {
scanf(“%c”,&ch);
if (ch==‘# ’) T = NULL;
else {
T = (BiTNode *)malloc(sizeof(BiTNode));
T->data = ch; // 生成根结点
CreateBiTree(T->lchild); // 构造左子树
CreateBiTree(T->rchild); // 构造右子树
}
}
这段代码对很多初学者来说一定是耳熟能详的,但是这里面涉及到一个很重要的问题,就是c语言中没有引用,因此'&'的使用编译器不会通过。
于是我们进而会选择不使用&符号,学习过c语言的应该都知道,指针其实就是一个地址,修改指针的内容就相当于修改了指针指向的地址的数据,我们可以将这个函数更改为一个返回值是根节点指针的函数,看看是否可以成功呢?
BiTree CreateBiTree(BiTree T) {
scanf(“%c”,&ch);
if (ch==‘# ’) T = NULL;
else {
T = (BiTNode *)malloc(sizeof(BiTNode));
T->data = ch; // 生成根结点
CreateBiTree(T->lchild); // 构造左子树
CreateBiTree(T->rchild); // 构造右子树
}
return T;
}
经过尝试,仍旧还是无法解决这个问题,二叉树仍然无法建立起来。
后来经过查找文献和资料,发现如下的方法可以成功构造二叉树:
void createBiTree(PTree *p)//建立二叉树
{
char ch;
scanf("%c", &ch);
getchar();
if(ch == '#')
*p = NULL;
else
{
*p = (PTree)malloc(sizeof(Tree));
(*p) -> ch = ch;
createBiTree(&(*p) -> lchild);
createBiTree(&(*p) -> rchild);
}
}
通过这种方法就可以完成二叉树的建立。继而去调用其它的遍历函数,即可得到期望的结果。