二叉搜索树的删除和联结

在一个二叉搜索树中删除带有给定关键字的节点。这个删除操作的实现删除在BST中遇到的第一个带有给定关键字v的节点。它从上向下处理,为适当的子树作递归调用,直到要删除的节点位于树根处。然后,它用两棵子树结合的结果取代该节点--右子树中最小的节点成为树根,接着把它的左链接设置成指向左子树。

 1 private:
 2     link joinLR(link a, link b)
 3     {
 4       if (b == 0) return a;
 5       partR(b, 0); b-> = a;
 6       return b;
 7      }
 8     void removeR(link& h, Key v)
 9     { if (h == 0) return;
10        Key w = h->item.key();
11        if (v < w) removeR(h->l, v);
12        if (w < v) removeR(h->r, v);
13        if (v == w)
14        { link t = h;
15           h = joinLR(h->l, h->r); delet t;
16         }
17      }
18 public: 
19     void remove(Item x)
20     {removeR(head, x.key());}

 两棵二叉搜索树的联结

如果任一二叉搜索树为空,另外一棵就是结果。否则,我们通过以下步骤结合两棵二叉搜索树:随意地挑选第一棵树的根作为树根,用根插入方法把它插入到第二棵,然后递归地结合左子树对和右子树对。

 1 private:
 2     link joinR(link a, link b)
 3     {if (b == 0) return a;
 4       if (a == 0) return b;
 5       insertT(b, a->item);
 6       b->l = joinR(a->l, b->l);
 7       b->r = joinR(a->r, b->r);
 8       delete a; return b;
 9      }
10 public:
11     void join(ST<Item, Key>&b)
12     {head = joinR(head, b.head);}

 

posted @ 2020-05-13 09:05  ~宁静致远~  阅读(141)  评论(0编辑  收藏  举报