我在维基百科上发现了这张照片:
根据图片下方的文字,有序的是:A,B,C,D,E,F,G,H,I
我理解A-F的顺序,但我不明白的是最后三个节点的顺序。它不应该是H,我,G?我以为你应该在第二次遭遇时列出内部节点并在第一次出现时离开?
编辑:如果图片中的树是普通树而不是二叉树,我的订单是否正确? (这样G只有一个节点,而不是一个右节点和一个空左节点。)答案 0 :(得分:3)
不幸的是维基百科是对的!
详细算法
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,之后你忽略了打印声明 会打印G - 在忽略那个打印语句后你跳到了下一个检查node-> right是否为NULL的语句 - 你发现它不是null(把你带到了我)。然后你没有直接打印我并检查它的左子当剩下的孩子 H 在那里,所以你打印它然后你回到我 - 父母,它的右边孩子是空的。因此维基百科是对的。
测试inorder遍历的提示 :创建一个二进制树,它接受整数(或一般数字)作为输入数据,当你按顺序遍历时,数字将按升序打印。
答案 1 :(得分:1)
维基百科提到的答案是正确的。你说你了解A-F,所以我会从G。
按顺序遍历系列:左 - 右 - 右。因此当遍历F并且算法转到F的右子时,它首先遇到G然后尝试找到G的左子。因为G的左子是null,所以没有打印然后它转到父,即G;所以G打印出来。现在,它转到了G的正确的孩子,即I。现在,它找到了我的左子,即H并打印它。然后它返回到我的父级并打印它。然后它遍历到我的右边,发现它是null。现在,遍历了所有节点后,算法终止。因此,顺序是G H I
答案 2 :(得分:0)
有序遍历的工作原理如下:
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`