【问题标题】:Problems with in-order tree traversal中序树遍历的问题
【发布时间】:2015-07-21 14:58:09
【问题描述】:
我在维基百科找到这张图片:
根据图片下方的文字,顺序为:A、B、C、D、E、F、G、H、I
我理解顺序 A-F,但我不理解的是最后三个节点的顺序。不应该是H,I,G吗?我以为你应该在第 2 次相遇时列出内部节点并在第 1 次相遇时离开?
编辑:如果图片中的树是普通树而不是二叉树,我的顺序是否正确? (这样 G 就只有一个节点,而不是一个右节点和一个空左节点。)
【问题讨论】:
标签:
data-structures
graph-algorithm
tree-traversal
inorder
【解决方案1】:
不幸的是,维基百科是对的!
详细算法
inorder_traversal(node)
{
if(node!=NULL)
{
inorder_traversas(node->left);
print(node->data); //you overlooked this statement on reaching G
inorder_traversal(node->right);
}
}
你在哪里漏掉了重点/走错了路?
在从 F 到达 G 时,您尝试进入 G 的左孩子,它是 NULL(简而言之,inorder_traversal(node->left) 语句失败,因为算法已经检查了if(node!=NULL)
并且 G 的左孩子是 NULL,所以之后它又来了回到 G,在那之后你忽略了 print 语句 会在那里打印 G - 在忽略那个 print 语句之后,你跳到下一个检查 node->right 的语句是否为 NULL - 您发现它不为 null(将您带到 I)。然后您没有直接打印 I 并检查其左孩子。作为左孩子 H 在那里,所以你打印了它,然后你返回到 I - 父母,它的右孩子是空的。因此维基百科是正确的。
测试中序遍历的技巧
:制作一个接受整数(或一般数字)作为输入数据的二叉树,当您以中序方式遍历时,数字将按升序打印。
【解决方案2】:
维基百科提到的答案是正确的。你说你懂 A-F,所以我从 G 那里得到。
按顺序遍历遵循序列:左-父-右。所以当遍历F,算法走到F的右孩子时,首先遇到G,然后尝试定位G的左孩子。由于G的左孩子为空,所以什么都不打印,然后去父, 即 G;所以 G 被打印出来。现在,它转到 G 的右孩子,即 I。现在,它找到 I 的左孩子,即 H 并打印它。然后它返回到我的父级并打印它。然后它遍历到 I 的右侧并发现它为空。现在,由于所有节点都已遍历,算法终止。因此顺序是 G H I
【解决方案3】:
按顺序遍历是这样工作的:
1- print the left sub tree.
2- print the root.
3- print the right sub tree
在您提供的示例中:
1- the left sub-tree of `G` is empty, so we do not print any thing.
2- we print the node `G`.
3- finally we print the right sub-tree of `G`