【问题标题】: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`
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-02
          • 1970-01-01
          • 2017-08-01
          • 2020-03-05
          • 2010-12-10
          • 1970-01-01
          • 2021-12-25
          相关资源
          最近更新 更多