【问题标题】:Traversing a tree into an array将树遍历到数组中
【发布时间】:2013-05-29 16:22:10
【问题描述】:

我应该按照前序、中序和后序遍历二叉搜索树,并将值插入到 Java 中的 Object[] 中。老实说,我不知道如何做到这一点,我需要一些建议。

我的功能:

public Object[] traversePreOrder()

我需要的只是一些关于如何完成这项任务的想法或提示。 如果我遍历一棵树作为前序 Object[0] 显然是根的值。然后我继续在左边的树中插入最左边的值到我的数组中。 接下来我插入最左边节点的右子节点,如果右节点没有子节点,则继续使用两个节点的父节点。

但是我的方法不记得哪些值已经被检查和插入。我还想过以后序遍历,将每个元素放入堆栈并将每个元素推送到我的数组中,但我对如何实现这一点的知识有限。

救命!

以下是我认为已经正确的内容:

@Override
public Object[] traversePreOrder() {
    Object[] preOrderArray = new Object[elements];
    if (elements == 0) {
        return preOrderArray;
    }



    return preOrderArray;

}

这个缺口显然要填补。

此外,我还有基本的方法和构造函数:

BinarySearchTreeNode(T value, BinarySearchTreeNode<T> left,
        BinarySearchTreeNode<T> right) {
    this.value = value;
    this.left = left;
    this.right = right;
}

BinarySearchTreeNode(T value) {
    this(value, null, null);
}

BinarySearchTreeNode<T> getLeft() {
    return left;
}

void setLeft(BinarySearchTreeNode<T> left) {
    this.left = left;
}

BinarySearchTreeNode<T> getRight() {
    return right;
}

void setRight(BinarySearchTreeNode<T> right) {
    this.right = right;
}

T getValue() {
    return value;
}

void setValue(T value) {
    this.value = value;
}

【问题讨论】:

标签: java tree traversal preorder


【解决方案1】:

使用递归的理想情况。创建方法

List<BinarySearchTreeNode> traverse(BinarySearchTreeNode n) {
    // traversal code
}

遍历代码在哪里遍历左孩子和右孩子(如果有的话),并且

  • 对于前序遍历,连接值、左孩子的结果和右孩子的结果;
  • 对于中序遍历,连接左孩子的结果、值和右孩子的结果;
  • 对于后序遍历,连接左孩子的结果、右孩子的结果和值。

为根调用traverse,并将结果转换为Object[]

【讨论】:

  • 非常感谢。我试试看。
  • 你能把这个递归方法的返回类型设为 List 吗?似乎每次调用它都会尝试返回一个单独的列表?也许我看错了……
  • 当然它每次都会返回一个单独的列表 - 只需将它们组合成您自己的列表即可。您的解决方案也可以正常工作,实际上是一个 log n-factor 更快,因为您没有复制列表,但您依赖于递归函数的副作用,这不太容易推理。
  • @Pulz 如果你喜欢,请考虑投票
【解决方案2】:

正如上面提到的阿伦德,这是一般的想法。我不确定你是否可以让它每次都返回一个列表,但你也许可以。但是,如果该实现不起作用,您可以尝试这样的操作,看看其他一切是否正常:

private List nodeValues = new ArrayList();

public void traversePreRecursive(BinarySearchTreeNode node) 
{
    if (node != null)
    {
        nodeValues.add(node.getValue());
        traversePreRecursive(node.getLeft());
        traversePreRecursive(node.getRight());
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-25
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多