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

来源:互联网 发布:麦克尼尔人类网络 编辑:程序博客网 时间:2024/06/08 00:00

这里写图片描述


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


#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 ;    }}
阅读全文
0 0
原创粉丝点击