二叉搜索树预订遍历

时间:2011-09-24 22:39:37

标签: binary-tree traversal binary-search

我有一个关于二叉搜索树的前序遍历的问题。我知道算法必须是什么,非常简单:

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);
        }
    }

2 个答案:

答案 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);
}