hihoCoder 1049 后序遍历

本文介绍了一种使用前序和中序遍历构建二叉树的方法,并实现了相应的C++程序。通过递归的方式创建二叉树节点,并采用后序遍历方式输出构建好的二叉树结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >




#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

struct BTreeNode{
    char e;
    BTreeNode *left;
    BTreeNode *right;
};
typedef BTreeNode* BTree;

BTreeNode *createBTreeNode(char e) {
    BTreeNode *nd = new BTreeNode;
    nd->e = e;
    nd->left = NULL;
    nd->right = NULL;
    return nd;
}
int findChar(const char *str, int s1, int s2, char c) {
    if (!str || s2 < s1 || s1 < 0 || s2 >= strlen(str))
        return -1;
    for (int i = s1; i <= s2; i++) {
        if (str[i] == c)
            return i;
    }
    return -1;
}
BTreeNode *getRoot(char *pre, int p1, int p2, char *in, int i1, int i2) {
    char rootch = pre[p1];
    if (!pre || p2 < p1 || p1 < 0 || p2 >= strlen(pre) || !in || i2 < i1 || i1< 0 || i2 >= strlen(in))
        return NULL;
    int tmp = findChar(in, i1, i2, rootch);
    if (tmp < 0)
        return NULL;
    BTreeNode *nd = createBTreeNode(rootch);
    nd->left = getRoot(pre, p1 + 1, p1 + tmp - i1, in, i1, tmp - 1);
    nd->right = getRoot(pre, p1 + tmp - i1 + 1, p2, in, tmp + 1, i2);
    return nd;
}
BTree createBTree(char *pre, char *in) {
    if (!pre || !in)
        return NULL;
    return getRoot(pre, 0, strlen(pre) - 1, in, 0, strlen(in) - 1);
}
void post_order(BTree t) {
    if (!t)
        return;
    post_order(t->left);
    post_order(t->right);
    printf("%c", t->e);
}

int main(){
    char pre[30];
    char in[30];
    scanf("%s",pre);
    scanf("%s",in);
    BTree t = createBTree(pre, in);
    post_order(t);
    printf("\n");
    return 0;
}


### 普通树后序遍历与森林后序遍历的关系 普通树的后序遍历和森林的后序遍历之间存在紧密联系。对于一棵普通的多叉树而言,其后序遍历可以通过将其转化为二叉树的形式来实现[^1]。具体来说,在转化过程中,每个节点的第一个孩子作为左子节点,而兄弟节点则依次连接为右子节点。 当考虑森林时,森林实际上是由若干棵独立的树组成的集合。在这种情况下,森林的后序遍历可以看作是对每棵树分别执行后序遍历,并按照它们在森林中的顺序依次处理的结果[^2]。换句话说: - 对于单棵树,后序遍历遵循 **“先访问所有子节点再访问根节点”** 的原则。 - 而对于整个森林,则需逐一对每一棵树应用上述规则,最终形成整体的后序序列。 #### 算法分析 以下是基于递归方法描述的一个简单例子用于说明这一过程: 假设有一个由三棵树构成的小型森林 A -> B 和 C (其中A有一颗子树B),那么它的后序遍历应该是先完成各单独树木内部自底向上的扫描即 `B` → `A` 接着才是孤立存在的另一株植物代表也就是最后得到总结果:`B`, `A`, `C`. ```python class TreeNode: def __init__(self, value=0, children=None): self.value = value self.children = children if children is not None else [] def postorder_traversal(tree_node): result = [] if tree_node: for child in tree_node.children: result += postorder_traversal(child) # Visit all subtrees first. result.append(tree_node.value) # Then visit the root itself. return result def forest_postorder(forest): traversal_result = [] for tree_root in forest: traversal_result.extend(postorder_traversal(tree_root)) return traversal_result ``` 此代码片段定义了一个通用版本适用于任意度数节点类型的树形数据结构及其对应的森林形式下的后序遍历操作函数[`postorder_traversal`]以及针对多个不相连个体组合而成的整体——即所谓的'Forest'-level视角下统一管理机制 [`forest_postorder`].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值