我有一个关于二叉搜索树的前序遍历的问题。我知道算法必须是什么,非常简单:
void preOrder(Node node) {
print(node);
if (node.left() != null)
preOrder(node.left());
if (node.right() != null)
preOrder(node.right());
}
由于某种原因,我的函数只打印出根节点的左侧子树,并打印出最低节点两次。我在右侧的一个项目上运行了search
方法,它返回true,因此我认为我的插入工作正常。为什么会这样?
我的代码如下。 public方法调用私有方法。在私有中,前两个if语句用于打印连接到该节点的左右节点。最后两个做了实际的递归算法。
public void print() {
if (root == null)
System.out.println("Tree is empty");
else
print(root);
}
private void print(NodeBST node) {
printOut(node);
if (node.left() != null) {
System.out.print("Left: ");
printOut(node.left());
}
else
System.out.println("No left");
if (node.right() != null) {
System.out.print("Right: ");
printOut(node.right());
}
else
System.out.println("No right");
System.out.println("");
if (node.left() != null) {
node = node.left();
print(node);
}
if (node.right() != null) {
node = node.right();
print(node);
}
}
答案 0 :(得分:1)
你遇到的一个问题就是你在第一个node
之前的行上覆盖print(node)
,然后再重新使用修改后的版本。在进行node
测试时,您可能希望if(node.right() != null)
成为原始值?
你可以通过例如只需在第一个print(node.left());
中调用if
。
答案 1 :(得分:1)
struct node *MakeBst(int preOrder[],int str,int end)
{
struct node *newnode;
if(str>end)
return NULL;
newnode = malloc(sizeof(node));
if(!newnode)
return NULL;
if(str == end)
return newnode;
newnode->data = preOrder[str];
str++;
x = search_Index(number>preOrder[str-1]);
newnode->left = MAkeBst(preOrder,str,x-1);
newnode->right = MAkeBst(preOrder,x-1,end);
}