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

这里写图片描述


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


#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 ;
    }
}

猜你喜欢

转载自blog.csdn.net/wyxwyx469410930/article/details/78702854