二叉树的插入函数

来源:互联网 发布:微机室网络还原软件 编辑:程序博客网 时间:2024/04/30 02:00
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;elsepNode->m_pRight=node;            }        }    }    return pRoot;}

0 0
原创粉丝点击