c++二叉树遍历已知中序,后序求前序

主体思想,利用后序最后一个一定是根节点开始,利用后序找到根节点,利用中序输出节点。

我们以洛谷一道题举例

P1030 [NOIP2001 普及组] 求先序排列

下面是我的AC代码

#include "bits/stdc++.h"
using namespace std;
string s1,s2;
void work(int start,int end,int boot){
    if (start>end) return;
    int i=start;
    while(i<end&&s1[i]!=s2[boot])i++;
    cout<<s1[i];
    work(start,i-1,boot-1+i-end);
    work(i+1,end,boot-1);
}
int main(){
    cin>>s1>>s2;
    work(0, s1.size()-1,s1.size()-1);
    return 0;
}//s1为中序,s2为后序

我们的start 和end是针对中序,而boot是针对后序来找到根节点;

主要代码

#include "bits/stdc++.h"
using namespace std;
string s1,s2;
void work(int start,int end,int boot){
    if (start>end) return;//不能加等号,这只是一个判断空节点的条件
    int i=start;
    while(i<end&&s1[i]!=s2[boot])i++;//找到根节点
    cout<<s1[i];//因为前序是根前后,所以我们找到这个节点直接输出
    work(start,i-1,boot-1+i-end);//在中序中前面,i-end为该节点右节点的节点数,我们减去就得到了左边这个节点(后序的特点)
    work(i+1,end,boot-1);//右边遍历
}
int main(){
    cin>>s1>>s2;
    work(0, s1.size()-1,s1.size()-1);
    return 0;
}//s1为中序,s2为后序

我之前还有一篇写知道前中,求后的,虽然很垃圾,或许有用

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
思路: 1. 根据前序遍历,找到根节点; 2. 根据中序遍历,找到根节点在中序遍历中的位置,从而确定左子树和右子树的中序遍历; 3. 根据左子树和右子树的节点数,可以在前序遍历中找到左子树和右子树的前序遍历; 4. 递归地处理左子树和右子树。 代码实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 根据前序遍历中序遍历构建二叉树 TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize) { if (preorderSize == 0 || inorderSize == 0) { return NULL; } TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = preorder[0]; int i; for (i = 0; i < inorderSize; i++) { if (inorder[i] == preorder[0]) { break; } } int leftSize = i; int rightSize = inorderSize - i - 1; root->left = buildTree(preorder + 1, leftSize, inorder, leftSize); root->right = buildTree(preorder + 1 + leftSize, rightSize, inorder + i + 1, rightSize); return root; } // 后序遍历二叉树 void postorderTraversal(TreeNode* root) { if (root == NULL) { return; } postorderTraversal(root->left); postorderTraversal(root->right); printf("%d ", root->val); } 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); postorderTraversal(root); return 0; } ``` 运行结果: ``` 4 5 2 6 3 1 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Nickname

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值