二叉树求解前序序列、中序序列、后序序列

前序序列:根左右;
中序序列:左根右;
后序序列:左右根。

从以下例子可以非常清楚地明白
图源参考
对于前序和中序的情况
前序序列:根左右
中序序列:左根右
1. 先找出前序的第一个节点(根节点),然后从中序,根据根节点分为左边树与右边树,然后再根据前序中紧邻根节点的元素,确定好根节点紧邻的第一个元素;
2. 然后就是套娃的过程:将紧邻根节点的元素作为“根节点”,从中序,根据“根节点”分出其左边树与右边树,再根据前序中紧邻“根节点”的元素继续找出下一个,直到结束。。。
在这里插入图片描述
对于中序和后序的情况
中序序列:左根右
后序序列:左右根
例子如下:
一棵二叉树的后序遍历序列为DGJHEBIFCA ,中序遍历序列为DBGEHJACIF,还原二叉树。
与前中序同样的道理,只是根节点在后序中的最后。
根据后序结果,根节点为A,从中序将节点分为左边树与右边树,然后找紧邻A的元素,即C为CIF一边的根节点
然后又开始套娃,除去AC后,说明F也是IF的根节点,这样,一边的就结束了,然后继续套娃。。。

需要注意的是,别忘了左右树的方向区别
结果如下:
在这里插入图片描述

  • 14
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我是CSDN开发的ChitGPT,可以帮你回答关于计算机和编程的问题。 关于你的第一个问题,如果已知二叉树遍历和遍历序列,可以通过递归算法求出其后遍历序列,具体步骤如下: 1. 如果遍历序列的长度为0,则返回空序列。 2. 取遍历序列的第一个元素作为根节点。 3. 在遍历序列找到根节点的位置,其左边为左子树的遍历序列,右边为右子树的遍历序列。 4. 分别求出左子树的遍历序列和右子树的遍历序列。 5. 递归求解左子树的后遍历序列和右子树的后遍历序列。 6. 将左子树的后遍历序列和右子树的后遍历序列依次加入到结果序列,并将根节点的值加入到结果序列。 7. 返回结果序列。 以下是一个C语言的实现: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构体 typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; // 递归求解叉树的后遍历序列 int* postorderTraversal(TreeNode* root, int* returnSize) { if (root == NULL) { *returnSize = 0; return NULL; } int* leftSize = (int*)malloc(sizeof(int)); int* rightSize = (int*)malloc(sizeof(int)); int* leftRes = postorderTraversal(root->left, leftSize); int* rightRes = postorderTraversal(root->right, rightSize); int size = *leftSize + *rightSize + 1; int* res = (int*)malloc(sizeof(int) * size); int index = 0; for (int i = 0; i < *leftSize; i++) { res[index++] = leftRes[i]; } for (int i = 0; i < *rightSize; i++) { res[index++] = rightRes[i]; } res[index++] = root->val; *returnSize = size; free(leftSize); free(rightSize); return res; } // 根据遍历序列遍历序列构建二叉树(递归) TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize) { if (preorderSize == 0) { return NULL; } // 取遍历序列的第一个元素作为根节点 int val = preorder[0]; TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = val; // 在遍历序列找到根节点位置 int midIndex = 0; for (int i = 0; i < inorderSize; i++) { if (inorder[i] == val) { midIndex = i; break; } } // 分别构建左子树和右子树 root->left = buildTree(preorder + 1, midIndex, inorder, midIndex); root->right = buildTree(preorder + 1 + midIndex, preorderSize - midIndex - 1, inorder + midIndex + 1, inorderSize - midIndex - 1); return root; } // 层遍历二叉树 void levelOrderTraversal(TreeNode* root) { if (root == NULL) { printf("null"); return; } TreeNode** queue = (TreeNode**)malloc(sizeof(TreeNode*) * 1000); int head = 0, tail = 0; queue[tail++] = root; while (head < tail) { TreeNode* node = queue[head++]; printf("%d ", node->val); if (node->left != NULL) { queue[tail++] = node->left; } if (node->right != NULL) { queue[tail++] = node->right; } } } int main() { // 二叉树遍历序列遍历序列 int preorder[] = {1, 2, 4, 5, 3, 6}; int inorder[] = {4, 2, 5, 1, 3, 6}; int size = sizeof(preorder) / sizeof(int); // 构建二叉树 TreeNode* root = buildTree(preorder, size, inorder, size); // 求解叉树的后遍历序列 int* postorder = postorderTraversal(root, &size); // 将后遍历序列带入递归算法获取原二叉树 root = buildTree(postorder, size, inorder, size); // 层遍历二叉树 levelOrderTraversal(root); free(postorder); return 0; } ``` 希望对你有所帮助。如果还有其他问题,可以继续问我哦。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值