这听起来像是一个典型的“用二叉树表示的通用树”,有两个指针:第一个孩子和下一个兄弟。我们可以把这棵树画成一棵标准的二叉树,每个孩子都有一个向下的箭头和一个向右的箭头。
我认为您评论中描述的树如下所示:
a
|
V
b ------------> c
| |
V V
d --> e --> f g
|
V
h --> i
您希望在树的每个节点处:
- 通过处理第一个孩子(按照向下箭头)首先打印所有后代。
- 然后打印节点的值
- 然后处理兄弟姐妹(按照右箭头)。
将其应用于上面的树,我们得到:
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
}
}