已知二叉树先序遍历中序遍历求后序遍历

这里写图片描述


思路简介:
①先序遍历中第一个字母即为根节点,在中序遍历中找到根节点的位置
②把中序遍历的字符串序列从根节点分成两部分,左侧一部分构建左子树,右侧一部分构建右子树
③在②的基础上在先序遍历中也找到构建左右子树的部分
④递归还原二叉树
⑤后序遍历输出即可


#include <iostream>
#include <string>
using namespace std ;
struct node
{
    node *left ;
    node *right ;
    char data ;
};
node *reroot(string s1, string s2)
{
    node *root = NULL ;
    //建立新的结点
    if(s1.size() > 0 )
    {
        root = new node() ;
        root -> data = s1[0] ;
        root -> left = NULL ;
        root -> right = NULL ;
    }
    if( s1.size() > 1 )
    {
        //找到根节点
        int root_position = s2.find(root->data);
        //重建左子树
        string pre_left = s1.substr(1,root_position); 
        string in_left = s2.substr(0,root_position) ;
        root -> left = reroot(pre_left,in_left);
        //重建右子树
        string pre_right = s1.substr(root_position + 1, s1.size());
        string in_right = s2.substr(root_position + 1 ,s2.size()) ;
        root -> right = reroot(pre_right,in_right);
    }
    return root ;
}
//后序遍历
void postorder(node *root)
{
    if(root)
    {
        postorder(root->left);
        postorder(root->right);
        cout << root -> data ;
    }
}
int main()
{   
    int number = 0 ;
    cin >> number ;
    for(int i = 0 ; i < number ; i ++ )
    {
        string preorder ;
        string inorder ;
        cin >> preorder >> inorder ;
        node *root = reroot(preorder,inorder);
        postorder(root);
        cout << endl ;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值