二进制搜索树 - 删除大于特定值的所有整数

时间:2015-02-12 18:01:08

标签: java data-structures binary-search-tree

我试图找出如何删除所有整数,使得a > b其中a是二叉搜索树中的任何元素,而b是BST中所有元素的比较阈值数至。到目前为止,我有:

public treeRemoveGreater(int x, BinaryNode node) {
       if (node.element > x) {
          //node.element accesses element of given node i.e. integer value
          remove(node.element);
       }
       else {
          //Traverse tree 
       }

我的问题是弄清楚如何相应地遍历树。我知道有一种有效的方式可以解决这个问题,因为不需要完全遍历树,我只是不确定如何继续。

2 个答案:

答案 0 :(得分:1)

想想BST的财产。父节点等于或大于左边的子节点,等于或小于右边的节点。所以你需要找到B并删除它右边的所有节点(只要确保右边的节点不等于B,因为你的条件都是> b)。就像Makoto说的那样删除整个子树。

答案 1 :(得分:1)

                      |
                 +----8----+
                 |         |
            +----3----+    10------+
            |         |            |
            1     +---6---+    +---14  
                  |       |    |
                  4       7    13

考虑这个BST,如果你想删除大于6的元素,那么你必须删除

  1. “6”的右子/子树,所以你可以消除
  2. 但你必须从根遍历。因此,检查root是否大于'a'(在本例中为8> 6),
  3. 将左子树作为主树(使用根'3')并将根与'a'进行比较,如果它仍然更大,则重复步骤2(或)
  4. 如果新的根小于'a',则向右移动它(这里3!> 6,所以从这里开始你不会触及根)
  5. 然后检查右边的节点,在这种情况下等于'a',所以转到它的右边节点检查你是否有重复的元素等于a(如果存在,那么遍历到那个节点并设置正确它的孩子'null'
  6. 如果向右移动,你会发现一个比6更大的元素(在这种情况下,如果你找到7代替6和6代替4),那么你必须做出根的左树的子树

         |                                 |
    +----7----+                            6
    |         |          ---->     
    6         7