我正在与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
答案 0 :(得分:1)
您的循环控制变量似乎无能为力。基本上它似乎是根据两棵树的大小执行相同的语句。
在BinarySearchTree实现上不确定,但我认为这是可行的:
我们想要使用通用元素创建新的BST。要找到共同的元素:
答案 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)
您的任务类似于“合并两棵树”,除了您只将常用元素放入输出树。所以基本上可以通过以下步骤在线性时间内完成:
从两棵树的最小元素开始使用迭代器。
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,从最小元素到最大元素,如果您在两个树中找到具有相同值的元素,则在输出树中使用该公共值创建一个节点。