定义一个二叉树节点的数据结构如下:
typedef struct TREE_NODE
{
TREE_TYPE value;
struct TREE_NODE *pLeft;
struct TREE_NODE *pRight;
}TreeNode;
插入节点的原型为:void insert(TreeNode **pLink,TREE_TYPE data);
如果要将数组元素a[10]={20,12,25,5,16,28,2,17,26,29};
下面分两种情况讨论:
① :当二叉搜索树为空时。例如插入20节点。如下图所示:
② :当二叉树不为空时,找到插入节点的位置,例如5节点
while((pCurrent=*pLink) != NULL)
{
if(data<pCurrent->value)
{
pLink =
&(pCurrent->pLeft);
}
else
{
pLink =
&(pCurrent->pRight);
}
}
细说这段代码:首先,pCurrent为一个节点指针,指向20这个节点。
判断5<20,执行:pLink =
&(pCurrent->pLeft);pLink中保存的是20节点中指向左孩子指针的指针,然后执行while((pCurrent=*pLink) != NULL),此时pCurrent指向12节点,pLink为指向12节点指针的指针。
判断5<12, 执行:pLink =
&(pCurrent->pLeft); pLink中保存的是12节点中指向左孩子指针的指针,然后执行while((pCurrent=*pLink) != NULL) ,此时pCurrent为NULL,退出while循环。
此时,pLink指向12节点中指向左孩子指针的指针。因此只需修改 (*pLink) ,即可将节点5插入。注意此时的*pLink==pCurrent;因此pCurrent为空闲指针,可将pCurrent指针指向新分配的节点块。
综合①②:列出源代码
void insert(TreeNode
**pLink,TREE_TYPE data)
{
TreeNode *pCurrent = NULL;
while((pCurrent=*pLink) != NULL)
{
if(data<pCurrent->value)
{
pLink =
&(pCurrent->pLeft);
}
else
{
pLink =
&(pCurrent->pRight);
}
}
pCurrent = (TreeNode
*)malloc(sizeof(TreeNode));
pCurrent->value = data;
pCurrent->pLeft = NULL;
pCurrent->pRight = NULL;
*pLink = pCurrent ;
}