【问题标题】:Binary Search Tree Preorder Traversal二叉搜索树前序遍历
【发布时间】:2011-09-24 22:39:37
【问题描述】:

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

void preOrder(Node node) {
    print(node);

    if (node.left() != null)
        preOrder(node.left());
    if (node.right() != null)
        preOrder(node.right());
}

由于某种原因,我的函数只打印出根节点的左侧子树,并且两次打印出最低节点。我在右侧的一个项目上运行了search 方法,它返回 true,所以我认为我的插入工作正常。为什么会这样?

我的代码如下。公共方法调用私有方法。在私有节点中,前两个 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);
        }
    }

【问题讨论】:

  • 你什么时候调用哪个方法? preOrder 和 print 都遍历树。
  • 没有名为preOrder的方法。 printOut 方法只打印出参数中节点的内容。基本上是System.out
  • 你为什么不使用 preOrder 极其简单的方案?
  • 什么意思?这做同样简单的预购。它只有一堆 if 用于测试打印输出。 @Stuart 刚刚解决了。

标签: binary-tree traversal binary-search


【解决方案1】:

您遇到的一个错误是您在第一个 print(node) 之前的行上覆盖了node,然后直接再次使用修改后的版本。在进行if(node.right() != null) 测试时,您可能希望node 成为原始值?

您可以避免这种情况,例如只需在第一个 if 中调用 print(node.left());

【讨论】:

  • 是的!就是这样。没注意到。非常感谢!
【解决方案2】:
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);
}

【讨论】:

    猜你喜欢
    • 2020-09-25
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多