当前位置: 首页 > 知识库问答 >
问题:

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

毛缪文
2023-03-14

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

所以我有一棵这样的树:

                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节点和左子BinaryTree节点。

一个节点有两个链接(一个指向左边,另一个指向右边的子节点),没有指向头部的链接。

因此,使用当前的方法,我能够成功地进行预购遍历,我通过编写存储在节点中的元素是什么的print语句进行测试。

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

你知道我错在哪里吗?变量prev应该包含对访问的最后一个节点的引用,所以如果它等于节点v(这是我指定的节点,以返回v之后的节点),难道我不应该得到下一个节点吗?

共有1个答案

曾阳飙
2023-03-14

下面是如何递归完成预购遍历的实现。

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

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

备注:

  1. 我不确定你的做法;为什么要返回节点?在任何情况下,当为null时,您可以使用该方法返回“emptyNode”并通过if语句处理它。
  2. 正如您所看到的,我只处理在任何级别都有更改。尝试用一个贯穿的方式将其可视化,您就会理解这个概念。
  3. 在开头缺少对空节点的检查(特别是T)。

您可以继续使您的结果适应于此。

最后一个注意事项是这种方法的运行时复杂性,我强烈建议理解递归函数的运行时复杂性。以后会帮你大忙的。查看这篇维基百科文章寻找复发关系。

 类似资料:
  • 中序遍历二叉树 按完全二叉树的层次遍历给出一棵二叉树的遍历序列(其中用0表示虚结点),要求输出该二叉树的深度及中序遍历该二叉树得到的序列。 输入格式: 首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据首先输入一个正整数n(n≤1000),代表给出的二叉树的结点总数(当然,其中可能包含虚结点)。结点编号均为正整数,且各不相同。 然后输入n个正整数,表示按完全二叉树(即第1层1

  • 这是一个相当简单的问题,我注意到当我表示一棵树时,无论我用哪种方式(后排序,按顺序,前排序)树叶总是以相同的顺序出现,从左到右。 我只是想知道为什么,这是有原因的吗? 我刚开始研究它们,就想到了这个。 编辑: 我有一棵这样的树: 叶节点为:D、E和F 预购顺序为:A、B、D、C、E、F 顺序是:D,B,A,E,C,F 后序是:D,B,E,F,C,A 叶子节点总是从左到右出现,不管我选择哪个顺序,问

  • 对于二叉搜索树:7为根,1为左子,10为右子。 我试过调试这个函数,看看它是如何工作的,但我似乎不能理解一件事。函数检查并看到1的左子项和右子项都为空后,它就移动到节点10,然后检查右子项是否为空。有人能解释一下递归模式,以及为什么方法在初始检查节点1后没有退出。

  • 为了上课,我必须创建一个状态对象的二叉树,每个状态对象包括一个居民对象的二叉树,这些居民对象组织住在每个州的人。我试图在一个给定的州中搜索最老的居民;然而,居民是按字母顺序组织在树中的,这对我的搜索毫无帮助。因此,我必须遍历整个居民树,更新保存最老的人的节点,并在树被完全遍历后返回它。我已经有了代码的第一部分,但是还停留在如何写递归的剩余部分。 状态树的方法: 然后是公共“包装器”状态树方法:

  • 我正在查看LeetCode问题98。验证二进制搜索树: 给定二叉树的,确定它是否是有效的二叉搜索树 (BST)。 有效的BST定义如下: 节点的左子树仅包含键小于节点键的节点。 节点的右子树仅包含键大于节点键的节点。 左右子树也必须是二叉搜索树。 下面提供的用前序遍历验证二叉树属性的代码有什么问题? 对于的测试用例,它将返回

  • 二叉树遍历崩溃求大神帮我分析分析 以下是我同学的代码可以跑 实在是看不出哪里有什么不同