哪个更好地实现二叉搜索树中的搜索操作(递归或循环)?
答案 0 :(得分:2)
如果您想搜索,则无需递归。对于这种情况,递归将是一种过度杀伤力。只需在叶节点(如果没有找到)找到或中断时写一个循环并中断
答案 1 :(得分:2)
我经常发现递归更容易实现,至少对树来说,使你的代码对其他人更具可读性。但最终取决于你的树是否平衡
如果您的树平衡,那么我认为您肯定可以使用递归,因为您可以确保递归调用不会超过log(n)(< em>例如对于n = 100000000,您将不得不进行的最差递归调用次数仅为27左右。
如果另一方面你的树不平衡那么我认为循环是你最好的选择,因为你可能需要检查树的所有元素并且递归将使用大量内存来维护堆栈。
答案 2 :(得分:0)
While(current != null)
最适合我。假设你已经将你的类TreeNode定义为y,在BST类中扩展了Comparable和TreeNode =&gt;&gt;实现布尔搜索方法如下
public class BST<E extends Comparable<E>>
extends AbstractTree<E> {
protected TreeNode<E> root;
protected int size = 0;
〜 〜 〜 〜
// Returns true if the element is in the tree
public boolean search(E e) {
TreeNode<E> current = root; // Start from the root
while (current != null) {
if (e.compareTo(current.element) < 0) {
current = current.left;
}
else if (e.compareTo(current.element) > 0) {
current = current.right;
}
else // element matches current.element
return true; // Element is found
}
return false;
}
答案 3 :(得分:0)
假设您有一个实体类BinaryTreeNode,这里是在二进制搜索树中搜索节点的非递归实现:
public static BinaryTreeNode searchBstNode(BinaryTreeNode temp, int data){
while(true){
if(temp.getData()==data){
break;
}
if(temp.getData()>data){
if(temp.getLeft()!=null){
temp=temp.getLeft();
}
else{
System.out.println("Data value ="+ data+" not found!");
return null;
}
}
if(temp.getData()<data){
if(temp.getRight()!=null){
temp=temp.getRight();
}
else{
System.out.println("Data value ="+ data+" not found!");
return null;
}
}
}
System.out.println("Data found in the BST");
return temp;
答案 4 :(得分:0)
什么是最好的算法取决于我们要解决的问题的背景。这个维基页面显示了这两者之间的良好控制。希望这会有所帮助。 http://en.wikipedia.org/wiki/Binary_search_algorithm