Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 二叉搜索树-删除大于某个值的所有整数_Java_Data Structures_Binary Search Tree - Fatal编程技术网

Java 二叉搜索树-删除大于某个值的所有整数

Java 二叉搜索树-删除大于某个值的所有整数,java,data-structures,binary-search-tree,Java,Data Structures,Binary Search Tree,我试图找出如何删除所有整数a,以便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.elem

我试图找出如何删除所有整数a,以便
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 
       }

我的问题是如何相应地遍历树。我知道这是一种有效的方法,因为不一定需要完全遍历树,我只是不确定如何继续

想想BST的属性。父节点等于或大于左侧的子节点,等于或小于右侧的节点。所以您需要找到B并删除其右侧的所有节点(只需确保右侧的节点不等于B,因为yur条件都是a>B)。就像Makoto说的,移除整个子树

                      |
                 +----8----+
                 |         |
            +----3----+    10------+
            |         |            |
            1     +---6---+    +---14  
                  |       |    |
                  4       7    13
考虑这个BST,如果你想删除大于6的元素,那么你必须删除

  • 正确的子树/子树为“6”,因此可以消除
  • 但你必须从根部穿过。因此,检查根是否大于“a”(在本例中为8>6)
  • 将左边的子树作为主树(根为“3”),并将根与“a”进行比较,如果它仍然较大,则重复步骤2(或)
  • 如果新根小于“a”,则向它的右子级移动(此处3!>6,因此从这里开始,您将不会接触根)
  • 然后检查右节点,该节点在本例中等于“a”,因此转到其右节点,检查是否存在与a相等的重复元素(如果存在,则遍历该节点,并将其右子节点设置为“null”)
  • 如果向右移动时,你发现一个大于6的元素(在这种情况下,如果你发现7在6的位置,6在4的位置),那么你必须用它的左树生成子树的根

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

  • 想象一下,你正在删除一整棵子树。当你到达一个节点时,如果它大于b,把它的左子树放在它的位置并重复。如果它小于b,继续向下向右子树。如果它正好是b,修剪右子树,你就完成了(假设多个b值沿着左子树)。