已知前序和中序求后序

本文解析了通过给定的二叉树前序遍历和中序遍历来确定树结构的方法,并详细解释了如何从这些序列推断出每个节点的位置,最终得到后序遍历的顺序。

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

前序:adbgcefh
说明a是根结点(前序:根,左的前序,右的前序)
好了但中序中dgbaechf
说明左边的部分中序是dgb并且d是左边的部分的根结点(注意树是递归定义的)
再看前序中有关的部分是dbg,d为根结点
放到中序中 说明g和b在d的右孩子里
回到前序 dbg 中序 dgb
说明b是d的右孩子,g是b的左孩子

看整个树右边的部分
前序 cefh
中序 echf
c是右边部分的根结点
e就是左孩子(由中序的结果得到)
c的右孩子那棵树的前序是fh 说明f是c的直接右孩子,而中序里h在f前,说明h是f的直接左孩子

于是后序遍历就是
gbdehfca
已知一棵二叉树的前序遍历(Preorder)遍历(Inorder),我们可以利用这两个序列重构出这棵树的后序遍历(Postorder)。因为前序、中遍历可以唯一确定一棵树的结构,而后序遍历是左子树、右子树、根节点的顺。 以下是使用C语言的一个简单算法: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树结点 typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 根据前序遍历重建后序遍历 TreeNode* buildTreeFromPreAndInOrder(int pre[], int in[], int n) { if (n <= 0) return NULL; // 中遍历找到根节点的位置 for (int i = 0; i < n; ++i) { if (in[i] == pre[0]) { TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = pre[0]; pre++; in += i + 1; // 留出右子树部分 break; } } // 递归构建左右子树 root->left = buildTreeFromPreAndInOrder(pre, in, n); root->right = buildTreeFromPreAndInOrder(pre, in, n); return root; } // 后序遍历 void postorderTraversal(TreeNode* root) { if (root != NULL) { postorderTraversal(root->left); postorderTraversal(root->right); printf("%d ", root->val); // 输出节点值 } } int main() { int pre[] = {1, 2, 4, 5, 3}; int in[] = {4, 2, 5, 1, 3}; int n = sizeof(pre) / sizeof(pre[0]); TreeNode* root = buildTreeFromPreAndInOrder(pre, in, n); printf("后序遍历结果:"); postorderTraversal(root); printf("\n"); return 0; } ``` 在这个示例中,`buildTreeFromPreAndInOrder`函数首定位到前序遍历的第一个元素,即当前节点。然后分别对左子树右子树进行递归处理,最后通过`postorderTraversal`打印出后序遍历的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值