很久没有写树的构建程式了,题目中用到,发现手非常生,写出来总是有bug,单步运行才排除错误。
本篇博文就是一次回顾。
这次树的存储方式选用的是链接存储方式。
结点结构定义依旧是:
typedef struct Node
{
int data;
Node *left;
Node *right;
}TNode;
很多书上的代码都省略了typedef,但是我省略以后测试不通过,具体细节未加深究。
初始化一棵树:
void Init(TNode * &root)
{
root = NULL;// 初始化时root为空
}
这里初始化仅仅将root指针设为空,因此还不存在data,left,right这些域。
这里需要强调的是,TNode * & root。
如果不加引用符号,这里会出错,具体原因,暂时留存,需要牵扯到更多的指针和引用方面的知识,我也不太熟悉了,等下复习。
记住需要更改指针指向的内存区域内容,就*&一起出来。
下面主要讲插入结点的写法:
void InsertNode(TNode * &root, int x)
{
if(root == NULL)
{
root = (TNode*) malloc(sizeof(TNode));
root->data = x;
root->left = NULL;
root->right = NULL;
}
else
{
TNode *temp = root;
//loop to find th correct spot
while(1)
{
if(x == temp->data)
{
// cout << "Error";
break;
}
if(x < temp->data)
{
if(temp->left != NULL)//如果左边没有空位,就继续往左走
{
temp = temp->left;
}
else //如果左边有空位,就在这里安顿
{