【问题标题】:Traversing a general tree recursively in depth-first order以深度优先顺序递归遍历一般树
【发布时间】:2012-11-20 06:03:19
【问题描述】:

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

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

这是我的二叉树代码:

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

谁能帮忙?

【问题讨论】:

  • 你为什么不用DFS
  • 通用的怎么定义?一个节点有一个子数组吗?您为一般情况尝试了什么?请详细说明
  • 每个节点都有两个指针!第一个指向第一个孩子,另一个指向下一个兄弟(对于一般树)。谢谢
  • 你能给出一个算法应该打印不同顺序的树吗?
  • a 作为根。指向它的第一个孩子 b.第一个孩子 (b) 指向下一个兄弟 c。 b 指向它的第一个孩子 (d)->(e)->(f) c 指向它的第一个孩子 (g)。 (g) 指向它的第一个孩子 (h)->(i)。用语言来画它是非常困难的。谢谢

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


【解决方案1】:

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

我认为您评论中描述的树如下所示:

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

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

  1. 首先打印所有后代,方法是处理第一个孩子(按照向下箭头)。
  2. 然后打印节点的值
  3. 然后处理兄弟姐妹(按照右箭头)。

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

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
    } 
}

【讨论】:

  • 你这里提出的遍历是中序遍历,不是后序遍历。函数的名称应该反映这一点,否则会产生误导。
猜你喜欢
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
相关资源
最近更新 更多