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

二叉树。叶节点的顺序(树遍历)

童琪
2023-03-14

这是一个相当简单的问题,我注意到当我表示一棵树时,无论我用哪种方式(后排序,按顺序,前排序)树叶总是以相同的顺序出现,从左到右。

我只是想知道为什么,这是有原因的吗?

我刚开始研究它们,就想到了这个。

编辑:

我有一棵这样的树:

        A
    B       C
  D       E   F

叶节点为:D、E和F

预购顺序为:A、B、D、C、E、F

顺序是:D,B,A,E,C,F

后序是:D,B,E,F,C,A

叶子节点总是从左到右出现,不管我选择哪个顺序,问题是为什么会这样,给这些节点以这个顺序出现有什么用。

我一直在读到这些类型的树被用作递归过程的表示,所以我的猜测是右叶节点是在左叶节点发生之后出现的情况,这就是为什么它们出现在以后的任何表示中?

共有3个答案

董良策
2023-03-14

因为,在所有这些遍历中,您访问左子树之前右子树。

扈翰
2023-03-14

所有这些遍历:预序、有序和后序遍历都是深度优先遍历。在所有这些节点中,左节点在右节点之前处理(只有根节点振荡):

Preorder :  <ROOT>  LEFT   RIGHT
Inorder  :  LEFT   <ROOT>  RIGHT
Postorder:  LEFT    RIGHT <ROOT>

在每一次穿越中,我们最终都是从左向右移动的。

因此,叶节点总是以相同的顺序出现——在所有三次遍历中。

上面的解决方案中有一点是关于与根不同距离的叶子。我通过以下示例验证了它:

PreOrder - 8, 5, 9, 7, 1, 12, 2, 4, 11, 3
InOrder - 9, 5, 1, 7, 2, 12, 8, 4, 3, 11
PostOrder - 9, 1, 2, 12, 7, 5, 3, 11, 4, 8 

即使在这种情况下,测序也成立

目的:它看起来更像是左右模式的结果。

范修伟
2023-03-14

因为,不管你把节点放在顺序的哪里,你总是在右边的孩子之前访问左边的孩子。然而,我不完全确定你的观察是否一定总是正确的,如果你的叶子离根的距离不一样——不过,我可能错了...

 类似资料:
  • 问题查找具有n个节点的完整二叉树中的叶节点数。 我为上述问题编写了一个递归程序,每当我到达一个没有子节点的节点时,遍历树并增加叶节点的数量。但由于这棵树是一棵完整的二叉树,我认为这会使问题变得更容易,但我不知道如何解决。它是否可以简化为紧凑形式(类似于公式)。

  • 我想对二叉树执行级别顺序遍历。因此,对于给定的树,说: 产出将是: 我知道我可以使用某种队列,但在C中递归地实现这一点的算法是什么?感谢您的帮助。

  • 我尝试按如下方式执行二叉树的垂直顺序遍历:1)找出每个节点与根节点之间的最小和最大水平距离2)创建一个hashmap,将水平距离映射到相应的节点(Map) 然而,我得到了不想要的输出,我认为在实现中有一些错误,因为算法对我来说似乎是正确的。 以下是完整的代码: 输出:{-1=[99999],0=[99999,12],-2=[99999],1=[99999],2=[99999]}那么我的apProc

  • 我正在尝试编写一个函数,该函数将使用级别顺序遍历将一个元素插入到二叉树中。我的代码遇到的问题是,当我在树中插入一个新节点后打印级别顺序遍历时,它以无限循环的方式打印元素。1,2,3,4,5,6,7,8这个数字一直在飞驰过终点站。我将感谢任何关于如何补救这种情况的指示和建议。 这是我通过修改级别顺序遍历技术将一个元素插入到树中的地方 主

  • 我正在研究爪哇的树木,在我正在研究的书中偶然发现了一些令人困惑的台词。给出的顺序遍历图如下: 遍历(递归)的代码是: 我感到困惑的是: 我已经突出了我所困住的部分。首先,我认为在第三步中,inOrder(C)[而不是inOrder(B)]返回inOrder(A)。第二,访问节点的顺序应该是B->A->C。 请帮帮我吧!

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