algorithm - Inorder 从 "leftmost left node"开始那么为什么 Preorder 不从 "leftmost middle node"开始?

标签 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

在进行中序遍历时,首先定位到最左边的节点,然后从那里开始遍历。但是当涉及到 Preorder 时,相同的逻辑(如 最左边的中间节点)不适用

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

为什么 Inorder 遍历从leftmost left node 而 PreOrder 遍历不是从leftmost middle node?

谢谢, 克里斯。

最佳答案

Preorder 总是将父级放在其后代之前(这是它的定义),因此它必须从根开始。如果愿意,您可以使用术语“最中间的中间节点”来表示根。

preorder 的典型用法是标准函数符号:如果你有类似的东西

f(g(x, h(y, z)))

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

      f
      |
      g
     / \
    x   h
       / \
      y   z

另一方面,+* 等运算符的常用符号使用中序:

a + b * c

的顺序符号
    +
   / \
  a   *
     / \
    b   c

如果我们使用 *+ 绑定(bind)更强的标准数学优先规则。

并在 reverse polish notation 中编写表达式将是 postorder 的一个例子。

关于algorithm - Inorder 从 "leftmost left node"开始那么为什么 Preorder 不从 "leftmost middle node"开始?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18521096/

相关文章:

javascript - 函数返回未定义而不是 bool 值。 BST, 力扣

algorithm - 在基于旋转的方向上移动时限制 x 和 y 跟踪的对象的最高速度

java - 将二叉树转换为仅包含叶节点的链表

java - 困惑 - 二叉树的高度

javascript - 左关联二叉树折叠

java - AES 算法安全吗?

php - 创建多维数组的算法

c - 如何将一个结构分配给另一个结构中已经存在的指针

JAVA 存储选项

c# - 替代字典进行快速键查找?