BinaryTree Inseart(int num[],int length)
{
if(num==NULL||length<=0)
return NULL;
BinaryTree pRoot;
BinaryTreeNode *node=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
node->m_nValue=num[0];
node->m_pLeft=NULL;
node->m_pRight=NULL;
pRoot=node;
BinaryTreeNode* pNode=pRoot;
for(int i=1;i<length;i++)
{
node=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
node->m_nValue=num[i];
node->m_pLeft=NULL;
node->m_pRight=NULL;
while(pNode!=NULL)
{
if(node->m_nValue < pNode->m_nValue)
{
pNode=pNode->m_pLeft;
}
else
{
pNode=pNode->m_pRight;
}
}
pNode=node;
}
return pRoot;
}
写完上面的的程序后认为没有差错,但是在验证时却发现,只有一个根元素。竟然是断开的二叉树,为什么呢?通过调试发现了问题,原来在新建一个node后,他的左右节点是NULL,即地址没有,但是在进行扫描时我们是通过pNode!=NULL 来判断的,找到了要插入的位置,然后pNode=node,这样就把插入节点node连接到二叉树中,但是pNode的初始地址是NULL,经过pNode=node后,pNode的地址就是node的地址了,与二叉树的地址NULL是没有关系的,也就连接不上,所以出现了问题。那怎么解决呢?
我们发现,当找到一个节点的进行插入左或右子节点,而左或右子节点为NULL那么就在NULL处pNode->left=node或者pNode->right=node;赋值完值后就说明已经插入了,可以退出循环。
BinaryTree Init(int num[],int length)
{
if(num==NULL||length<=0)
return NULL;
BinaryTree pRoot;
BinaryTreeNode *node=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
node->m_nValue=num[0];
node->m_pLeft=NULL;
node->m_pRight=NULL;
pRoot=node;
for(int i=1;i<length;i++)
{
node=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
node->m_nValue=num[i];
node->m_pLeft=NULL;
node->m_pRight=NULL;
BinaryTreeNode* pNode=pRoot;
while(pNode->m_pLeft!=node && pNode->m_pRight!=node)
{
if(node->m_nValue < pNode->m_nValue)
{
if(pNode->m_pLeft)
pNode=pNode->m_pLeft;
else
pNode->m_pLeft=node;
}
else
{
if(pNode->m_pRight)
pNode=pNode->m_pRight;
else
pNode->m_pRight=node;
}
}
}
return pRoot;
}