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

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

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

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

这是我的二叉树代码:

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

有人能帮忙吗?

最佳答案

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

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

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

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

  1. 首先打印所有后代,通过处理第一个 child (按照向下箭头)。
  2. 然后打印节点的值
  3. 然后处理 sibling (按照右箭头)。

将其应用于上面的树,我们得到:

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

为通用树编写一个新函数(注意 printf 应该使用双引号格式字符串):

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

关于c - 以深度优先顺序递归遍历一般树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13671959/

相关文章:

reactjs - 使用 Reactjs 来自相同 JSON 的具有父 ID 的嵌套树

c++ - 使用递归 C 替换数组中的所有负值

sql-server - 什么是 Bw 树?

c - 是否可以在宏中定义宏?

c - char *myString 和 myString[] 之间的区别

c - 我如何实现一个 gpsd 客户端(在 C 中)来获取纬度、经度和海拔高度?

python - 递归代码返回 None

c# - 将 JSON 转换为 C# 复杂对象

c++ - 四叉树遍历

c - 在 C 中写入标准输出是什么意思?