考虑这棵树:
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遍历不是从 最左边的中间节点开始的
谢谢, 克里斯。
答案 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 表示中使用相同的节点。