有序树遍历的问题

时间:2015-07-21 14:58:09

标签: data-structures graph-algorithm tree-traversal inorder

我在维基百科上发现了这张照片:enter image description here

根据图片下方的文字,有序的是:A,B,C,D,E,F,G,H,I

我理解A-F的顺序,但我不明白的是最后三个节点的顺序。它不应该是H,我,G?我以为你应该在第二次遭遇时列出内部节点并在第一次出现时离开?

编辑:如果图片中的树是普通树而不是二叉树,我的订单是否正确? (这样G只有一个节点,而不是一个右节点和一个空左节点。)

3 个答案:

答案 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`