二叉树,返回前序遍历中的下一个节点

时间:2013-03-04 16:58:04

标签: java binary-tree preorder

我有一项任务,我需要一些方法的帮助。

所以我有一棵这样的树:

                A
              /   \
             B     C
           /   \ /   \
          D    E F     G
        /   \
       H      I
     /   \
   J       K

我的方法是:

public BinaryTree preorderNext(BinaryTree t, BinaryTree v, BinaryTree prev) {       

    prev = t;

    if(t.getLeft() != null) {
        preorderNext(t.getLeft(), v, prev);
    }

    if(t.getRight() != null) {
        preorderNext(t.getRight(), v, prev);
    }


    if(prev == v) {
        return t;
    }

    return null;
}

讲师给出了树的简单实现。该类称为BinaryTree,如果要创建节点链接,则指定左右子BinaryTree节点。

一个节点有两个链接(一个在左边,另一个在右边的子节点),并且没有链接到头部。

因此,使用当前方法,我能够成功执行前序遍历,我通过编写存储在节点上的元素的print语句进行测试。

但是当我运行测试时,它告诉我A中的下一个预订节点是B,而来自K的下一个预订节点抛出一个空异常,但它应该是I?

我出错的地方有什么想法吗?变量prev应该保存对最后访问的节点的引用,所以如果它等于节点v(我指定的节点,在v之后返回节点),我不应该得到下一个节点吗?

3 个答案:

答案 0 :(得分:1)

我不确定递归执行该任务是否那么容易。

使用堆栈以迭代方式解决任务可能是一种更好的方法:

public BinaryTree preOrderNext(BinaryTree toSearch) {

    Stack<BinaryTree> openList = new Stack<BinaryTree>();

    openList.push(root);

    while (openList.empty() == false) {
        BinaryTree curr = openList.pop();

        if (curr.getRight() != null)
            openList.push(curr.getRight());

        if (curr.getLeft() != null)
            openList.push(curr.getLeft());

        if (curr.equals(toSearch) && openList.empty() == false){
            return openList.pop();
        }
    }
    return null;
}

此方法未经过测试,但应该正常运行。

答案 1 :(得分:0)

以下是递归执行preorder traversal的方法。

public void preOrderTraversal(BinaryTree root){
    if(root == null) return;

    System.out.println(root);
    preOrderTraversal(root.getLeft());
    preOrderTraversal(root.getRight());
}

注意:

  1. 我不确定你的做法;你为什么要回一个节点?在任何情况下,当root为null时,您可以返回“emptyNode”并通过if语句处理它。
  2. 正如您所看到的,我只处理rootroot更改任何级别。尝试通过贯穿期来想象这一点,您将理解这个概念。
  3. 您在开始时缺少对空节点的检查(特别是对于t)。
  4. 您可以继续调整结果。

    最后要注意的是这种方法的运行时复杂性,我强烈建议您了解递归函数的运行时复杂性。它将来会帮助你很多。检查this wikipedia article是否有重复关系。

答案 2 :(得分:0)

我提供了一个在O(h)运行时间内运行的答案。

class Node {
    public int key;
    public Node l;
    public Node r;
    public Node p;

    public Node(int key) {
        this.key = key;
        this.l = null;
        this.r = null;
        this.p = null;
    }
}

public Node preorderNext(Node v) {
    if (v.l != null) {
        return v.l;
    } else if (v.r != null) {
        return v.r;
    } else {
        while (v.p != null) {
            if (v == v.p.l) {
                if (v.p.r != null) {
                    return v.p.r;
                } else {
                    v = v.p;
                }
            } else {
                if (v.p.p == null) {
                    return null;
                } else if (v.p == v.p.p.l) {
                    if (v.p.p.r != null) {
                        return v.p.p.r;
                    } else {
                        v = v.p;
                    }
                } else {
                    v = v.p;
                }
            }
        }
        return null;
    }
}