一、介绍
本质上也是一个递归。
看下图:
我们要将一个序列的值,按照顺序插入二叉树中。
其中:第一个插入的是根节点
之后插入的结点,如果比父结点小,则向左遍历,将其左子树当成下一次遍历的父结点;如果比父结点大,则向右遍历,将其右子树当成下一次遍历的父结点。
直到父结点的某棵子树是空的,而这个结点的下一次遍历正好到该子树的根结点时,进行插入。
二、思路
不断利用递归进行判断。
这里要尤其注意,传参需要传递二级指针!
因为我们传入的树本身是一个指针,我们需要改变这个指针的值(分配空间),所以需要传递该指针的指针才行。
建议朋友们看一看我写的这两篇文章,有举例详解:
指针传参:https://blog.youkuaiyun.com/Kukeoo/article/details/114297006
“空”指针:https://blog.youkuaiyun.com/Kukeoo/article/details/114297192
三、代码
//建立二叉搜索树
void insert(Tree* t, int value)
{
Node* node = (Node*)malloc(sizeof(Node));
node->data = value;
node->left = NULL;
node->right = NULL;
if (*t == NULL)
{
*t = node;
}
else
{
//临时结点,永远指向父节点
Node* temp = *t;
//开始循环遍历,循环条件为当前结点不为空
while (temp != NULL)
{
//如果进入左子树
if (value < temp->data)
{
if (temp->left == NULL)
{
temp->left = node;
return;
}
else
{
temp = temp->left;
}
}
//如果进入右子树
else
{
if (temp->right == NULL)
{
temp->right = node;
return;
}
else
{
temp = temp->right;
}
}
}
}
}
四、测试
用中序遍历查看:
int main()
{
Tree t = NULL;
Tree* tt = &t;
insert(tt, 5);
insert(tt, 3);
insert(tt, 4);
insert(tt, 8);
insert(tt, 9);
insert(tt, 1);
inOrder(t);
releaseTree(t);
return 0;
}