二叉搜索树的删除和联结

Posted ningjing213

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉搜索树的删除和联结相关的知识,希望对你有一定的参考价值。

在一个二叉搜索树中删除带有给定关键字的节点。这个删除操作的实现删除在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);}

 

以上是关于二叉搜索树的删除和联结的主要内容,如果未能解决你的问题,请参考以下文章

C++-二叉搜索树的查找&插入&删除-二叉搜索树代码实现-二叉搜索树性能分析及解决方案

二叉搜索树的插入,删除,和中序遍历

Leetcode 450.删除二叉搜索树的节点

数据结构——搜索二叉树的插入,查找和删除(递归&非递归)

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用

二叉搜索树的插入与删除(C语言)