顺序从“最左边的节点”开始,为什么Preorder不从“最左边的中间节点”开始?

时间:2013-08-29 21:15:08

标签: algorithm data-structures binary-tree binary-search-tree tree-traversal

考虑这棵树:

           7
         /    \
       /        \
      /          \
     1            9
    /  \         /  \
   0    3       8   10 
       / \
      2   5
         / \
        4   6

中序:

0,1,2,3,4,5,6,7,8,9,10

预订:

7,1,0,3,2,5,4,6,9,8,10

在进行Inorder遍历时,首先找到最左边的节点,并从那里开始遍历。但是,当涉及预订时,不应用相同的逻辑(如最左边的中间节点

在除了根7之外的上述树中,有1和9都是中间节点。 1是最左边的中间节点,9是最右边的中间节点。按照InOrder上面应用的逻辑,Preorder遍历应该从节点1开始,这是最左边的中间节点,但不是这样,为什么?

为什么在顺序中,遍历从 最左边的节点 开始,但是PreOrder遍历不是从 最左边的中间节点开始的

谢谢, 克里斯。

2 个答案:

答案 0 :(得分:3)

预先命令总是将父项放在它的后代之前(即它的定义),因此它必须以root开头。如果您愿意,可以使用术语“midllemost middle node”作为根。

预订的典型用法是标准函数表示法:如果您有类似

的内容
f(g(x, h(y, z)))

那么这是以下表达式树的前序表示法,它使用内部节点的函数名称和变量作为离开节点:

      f
      |
      g
     / \
    x   h
       / \
      y   z

另一方面,+*等运营商的常用符号使用 inorder

a + b * c

的顺序表示法
    +
   / \
  a   *
     / \
    b   c

如果我们使用标准数学优先级规则*绑定强于+

reverse polish notation中撰写表达式将是后序的一个例子。

答案 1 :(得分:1)

按顺序:遍历左子树;访问当前节点;遍历右子树;

预购:访问当前节点;遍历左子树;遍历右子树;

后序:遍历左子树;遍历右子树;访问当前节点;

请注意,除非缺少左子树,否则在Inorder和Preorder中永远不会有相同的节点。

但是,如果存在左子树,则可以在Inorder和 PostOrder 表示中使用相同的节点。