根据前序与中序输出后序

因为前序最先访问的一定是根节点,所以我们可以令root为前序中当前根节点的下标,通过找到pre[root]在中序中的位置,可以将中序的左子树与右子树划分出来。start与end划定子树的节点在中序中的范围,递归打印后序序列,出口为start>end。

#include<bits/stdc++.h>
using namespace std;
int in[50],pre[50];
int n;
int build(int root,int start,int end){
    if(start>end) return 0;
    int i=start;
    while(in[i]!=pre[root]) i++;
    build(root+1,start,i-1);
    build(root+i-start+1,i+1,end);
    printf("%d ",pre[root]);
}
int main()
{
    int i;
    cin>>n;
    for(i=0;i<n;i++) cin>>pre[i];
    for(i=0;i<n;i++) cin>>in[i];
    build(0,0,n-1);
    return 0;
}

建树:

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int maxn=10005;
struct BitNode{
    int val;
    BitNode *lchild,*rchild;
};
BitNode* T;
BitNode* CreateBitNode(int *pre,int *in,int len)
{
    int i,j;
    if(len==0)
        return NULL;
    for(i=0;i<len;i++)
        if(in[i]==pre[0]) break;
    BitNode* p=new BitNode;
    p->val=pre[0];
    p->lchild=CreateBitNode(pre+1,in,i);
    p->rchild=CreateBitNode(pre+i+1,in+i+1,len-i-1);
    return p;
}
void Traver(BitNode *T)
{
    if(!T)
        return;
    Traver(T->lchild);
    Traver(T->rchild);
    cout<<T->val<<' ';
}
int main()
{
    int t;
    int pre[maxn],in[maxn];
    while(~scanf("%d",&n)){
        for(int i=0;i<n;i++)
            scanf("%d",&pre[i]);
        for(int i=0;i<n;i++)
            scanf("%d",&in[i]);
        T=CreateBitNode(pre,in,n);
        Traver(T);
        cout<<endl;
    }
    return 0;
}

在计算机科学中,如果我们想要通过已知的前序遍历和中遍历顺重建一棵二叉树并得到其后序遍历,这通常需要一些算法技巧。因为前序、中后序遍历分别对应根节点-左子树-右子树、左子树-根节点-右子树和左子树-右子树-根节点的访问模式。 以下是C++的一种解决方案,利用递归: ```cpp #include <iostream> using namespace std; // 定义二叉树节点 struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; // 中遍历函数 TreeNode* inorderTraversal(TreeNode* root) { if (root == nullptr) return nullptr; return inorderTraversal(root->left) -> root -> right; } // 前序遍历函数 TreeNode* preorderTraversal(TreeNode* root) { if (root == nullptr) return nullptr; return new TreeNode(root->val) -> inorderTraversal(root->right) -> preorderTraversal(root->left); } // 后序遍历结果辅助函数 void printPostorderHelper(TreeNode* node, vector<int>& res) { if (node == nullptr) return; printPostorderHelper(node->left, res); printPostorderHelper(node->right, res); res.push_back(node->val); } // 输出后序遍历 void printPostorder(TreeNode* root) { vector<int> res; printPostorderHelper(root, res); for (int val : res) cout << val << " "; cout << endl; } int main() { // 创建示例二叉树 TreeNode* tree = new TreeNode(1); // 假设已有前序和中遍历结果 // 填充中遍历和构建二叉树 // ... // 使用前序遍历生成二叉树结构 tree = preorderTraversal(tree); // 输出后序遍历 printPostorder(tree); return 0; } ``` 在这个代码中,`preorderTraversal`函数首先创建根节点,然后递归地处理左右子树的中遍历。接着,我们有一个辅助函数`printPostorderHelper`用于逐步收集后序遍历的结果,并在主程中打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值