以深度优先顺序递归遍历一般树

时间:2012-12-02 17:47:14

标签: c recursion tree binary-tree depth-first-search

我被要求实现一个递归函数,用于遍历一般树(第一个孩子,下一个兄弟符号)和深度优先的二叉树。

该函数应在上次访问节点时打印该节点。例如,对于下面的树,应按以下顺序打印节点。 我想我已经完成了二叉树的功能,但我不能做一般的功能:

这是我的二叉树代码:

void PostOrder(node* root) {
    if (root == NULL)
        return;
    else { 
          PostOrder(root->left); 
          PostOrder(root->right);
          printf(‘%c’, root->key); 
    } 
}

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

这听起来像是一个典型的“一般树,表示为二叉树”,有两个指针:第一个孩子和下一个兄弟。我们可以将树绘制为标准二叉树,每个孩子都有一个向下箭头和一个向右箭头。

我认为评论中描述的树看起来像这样:

a
|
V
b ------------> c
|               |
V               V
d --> e --> f   g
                |
                V
                h --> i

您希望在树的每个节点上:

  1. 首先打印所有后代,处理第一个孩子(按向下箭头)。
  2. 然后打印节点的值
  3. 然后处理兄弟姐妹(按照右箭头)。
  4. 将其应用于上面的树,我们得到:

    GeneralTreePostOrder(a) ->
        GeneralTreePostOrder(b) ->   # Follow child pointer
            GeneralTreePostOrder(d) ->   # Follow child pointer
                # No children
                print d
                GeneralTreePostOrder(e) ->   # Follow sibling pointer
                     # No children
                     print e
                     GeneralTreePostOrder(f) ->   # Follow sibling pointer
                         # No children
                         print f
                         # No more siblings
            print b
            GeneralTreePostOrder(c) ->   # Follow sibling pointer
    

    等,打印d e f h i g c a

    为通用树编写新函数(N.B。printf应使用双引号格式字符串):

    void GeneralTreePostOrder (node* root) {
        if (root == NULL)
            return;
        else {
             GeneralTreePostOrder (root->left); // Process children
             printf ("%c", root->key); 
             GeneralTreePostOrder (root->right); // Process siblings
        } 
    }