BST的常见元素

时间:2014-01-17 14:05:48

标签: java recursion binary-search-tree

我正在与BST合作,并且我被要求获得2 BST中的公共元素并将它们插入到第3个BST中。我的方法应该返回第3个BST。在使用LL时我做了同样的事情,但现在对于BST,我不知道从哪里开始!我想出了一个解决方案,但问题是它正在使用树的根,这对我来说似乎不对。我迷路了,我找不到起点。建议非常感谢。

编辑:我在BST课程中创建了方法

 public BinarySearchTree common(BinarySearchTree t1,BinarySearchTree t2){
    return commonValues(t1.root,t2.root);
}


private BinarySearchTree commonValues(BinaryTreeNode node1, BinaryTreeNode node2) {
    //  BinaryTreeNode temp1;
    //  BinaryTreeNode temp2;
    BinarySearchTree tree = new BinarySearchTree();

    if (node1 == null && node2 == null) {
        System.out.println("Empty trees!");
    } else {
        if (node1.getInfo().equals(node2.getInfo())) {
            tree.insert(node1.getInfo());
        } else if (node1.getInfo().compareTo(node2.getInfo()) > 0) { // go left
            node1 = node1.getLlink();
            commonValues(node1, node2);
        } else {
            node2 = node2.getRlink();
            commonValues(node1, node2);
              }
       }
       return tree;
   }

我每次运行时都会遇到NullPointerException

3 个答案:

答案 0 :(得分:1)

您的循环控制变量似乎无能为力。基本上它似乎是根据两棵树的大小执行相同的语句。

在BinarySearchTree实现上不确定,但我认为这是可行的:

我们想要使用通用元素创建新的BST。要找到共同的元素:

  1. 新树(T3)只会与(T1,T2)
  2. 中的较小树一样大
  3. 比较T1和T2的大小
  4. 使用较小的一个搜索较大的树。遍历 预购方式。对于每个节点,如果搜索返回true,则创建一个 插入T3

答案 1 :(得分:0)

我不知道究竟BinarySearchTree的界面是什么,但我会提出一些想法。

首先,你需要越过树,因为如果你总是检查root,你什么都不做。您可以使用一种方法为您提供某个orden中的下一个节点,例如pre-order(以下示例中为t2Iterator.next())。

第二件事是你不需要遍历两棵树来插入公共元素,一次是这样的:如果你做了第二个循环,你将插入第一个循环中的相同元素。

在代码中,这是我想说的。

public static BinarySearchTree common(BinarySearchTree t1, BinarySearchTree t2) {

    BinarySearchTree t3 = new BinarySearchTree();
    BinarySearchTree t2Iterator = t2;

    for (int x = 0; x < t2.size(); x++) {
        if (t1.search(t2Iterator.root.getInfo())) {
            t3.insert(t2Iterator.root.getInfo());
        } 
        t2Iterator = t2Iterator.next();
    }

    return t3;
}

这就是预订遍历的下一个功能

BinarySearchTree next() {
    if (leftChild != null) {
        return leftChild;
    }
    else if (rightChild != null) {
        return rightChild;
    }
    else {
        BinarySearchTree iterator = this;
        while (iterator.parent != null) {
            if (iterator.parent.rightChild != null) {
                return iterator.parent.rightChild;
            }

            iterator = iterator.parent;
        }

        return null;
    }
}

答案 2 :(得分:0)

您的任务类似于“合并两棵树”,除了您只将常用元素放入输出树。所以基本上可以通过以下步骤在线性时间内完成:

  1. 从两棵树的最小元素开始使用迭代器。

  2. 2。
    while both iterators are inside trees:
    if (TreeA.node(iteratorA).value > TreeB.node(iteratorB).value) 
       iteratorB = nextNodeinB();
    else if (TreeA.node(iteratorA).value < TreeB.node(iteratorB).value)
       iterator A = nextNodeInA();
    else
       outputTree.add(new node(TreeA.node(iteratorA).value)); //the values are equal, so add to the output tree.
    
         

    3。如果其中一棵树的迭代器不在其树中,则检查另一棵树中的其余元素,如果它们中的任何元素等于已完成树的最后一个元素。

    因此,您将遍历两个树inOrder,从最小元素到最大元素,如果您在两个树中找到具有相同值的元素,则在输出树中使用该公共值创建一个节点。