回 帖 发 新 帖 刷新版面

主题:[讨论]关于二叉搜索树的插入问题

我看 严蔚敏 的数据结构中,说到二叉搜索树插入的问题
其代码:
[code=c]
Status InsertBst(BiTree& T, ElemType e){
    if (!SearchBST( T,e.key,NULL,p){
         s = (BiTree) malloc (sizeof (BiTNode));
         s->data = e; s->lchild = s->rchild = NULL;
         if(!p) T = s;
         else if LT(e.key,p->data.key) p->lchild = s;
         else  p->rchild = s;
         return TRUE;
         }
     else return FALSE;
}
[/code]
为何这里需要储存parent的信息呢? 直接利用当前结点,也可以做插入.
如,
[code=c]
void insert(BiTreeNode*& root, int key)
{
     if(root == NULL)
     {
         BiTreeNode* newnode = new BiTreeNode;
         newnode->data = key;
         newnode->lchild = newnode->rchild = NULL;
         root = newnode;
     }
     else if(key > root->data)
         insert(root->rchild,key);
     else
         insert(root->lchild,key);
}
[/code]

感觉上不需这个parent也行吧?而且它找到插入位置后,还将key跟parent的data再作一次对比..
为何不直接把插入位置指向新结点呢?

回复列表 (共5个回复)

沙发

二叉搜索树不能有值相同的节点,以上

板凳

void insert(BiTreeNode*& root, int key)
{
     if(root == NULL)
     {
         BiTreeNode* newnode = new BiTreeNode;
         newnode->data = key;
         newnode->lchild = newnode->rchild = NULL;
         root = newnode;
     }
     else if(key == root->data)
          return;
     else if(key > root->data)
         insert(root->rchild,key);
     else
         insert(root->lchild,key);
}

这样也行吧?

3 楼

[quote]void insert(BiTreeNode*& root, int key)
{
     if(root == NULL)
     {
         BiTreeNode* newnode = new BiTreeNode;
         newnode->data = key;
         newnode->lchild = newnode->rchild = NULL;
         root = newnode;
     }
     else if(key == root->data)
          return;
     else if(key > root->data)
         insert(root->rchild,key);
     else
         insert(root->lchild,key);
}

这样也行吧?[/quote]
第一,相当于你还是保存了父节点。第二,插入是否成功你没有状态返回,这不利于调试及代码重用

4 楼

一般来说,用来输入和处理的函数最好都能返回至少一个状态值,而输出函数根据需要不返回值的状态略多一些

5 楼

受教了....原来如此

Status insert(BiTreeNode*& root, int key)
{
     if(root == NULL)
     {
         BiTreeNode* newnode = new BiTreeNode;
         newnode->data = key;
         newnode->lchild = newnode->rchild = NULL;
         root = newnode;
         return OK;
     }
     else if(key == root->data)
          return FALSE;
     else if(key > root->data)
         return insert(root->rchild,key);
     else
         return insert(root->lchild,key);
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册