码迷,mamicode.com
首页 > 其他好文 > 详细

根据前序和中序重建二叉树

时间:2014-05-22 23:56:14      阅读:408      评论:0      收藏:0      [点我收藏+]

标签:数据结构   算法   

注意:1、仅根据前序和后序无法构建唯一的二叉树;2、二叉树前序遍历,第一个数字总是树的根节点的值;3、中序遍历中,根节点的值在序列的中间,左子树的值子在根节点的值的左边,右字树的值在根节点的值的右边;4、思路:递归

#include <iostream>
#include <stdlib.h>
using namespace std;
struct Node{
    int value;
    Node* left;
    Node* right;
};

Node* ConstructCore(int *startPreorder,int *endPreorder,int *startInorder,int *endInorder){
    Node* root=new Node();
    root->value=startPreorder[0];
    root->left=root->right=NULL;

    //如果仅有一个节点
    if(startPreorder == endPreorder){
        if(startInorder == endInorder && *startPreorder == *startInorder){
            return root;
        }
        else{
            cout<<"Invalid input"<<endl;
            exit(1);
        }
    }

    //在中序遍历中找到根节点的值
    int *rootInorder=startInorder;
    while( rootInorder<=endInorder && *rootInorder!=root->value){
        rootInorder++;
    }

    if(rootInorder == endInorder && *rootInorder != root->value){
        cout<<"Invalid input"<<endl;
        exit(1);
    }

    int leftLength=rootInorder-startInorder;
    int *leftPreorderEnd=startPreorder+leftLength;

    //递归调用,构建
    if(leftLength>0){
        root->left=ConstructCore(startPreorder+1,leftPreorderEnd,startInorder,rootInorder-1);
    }

    if(leftLength < endPreorder - startPreorder){
        root->right=ConstructCore(leftPreorderEnd+1,endPreorder,rootInorder+1,endInorder);
    }

    return root;
}
//构建函数
Node* Construct(int *preorder,int * inorder,int length){
    if( preorder == NULL || inorder == NULL || length<=0){
        return NULL;
    }
    return ConstructCore(preorder,preorder+length-1,inorder,inorder+length-1);
}
void pre_order(Node* root){
    if(root != NULL){
        cout<<root->value<<" ";
        pre_order(root->left);
        pre_order(root->right);
    }
}

void in_order(Node* root){
    if(root != NULL){
        in_order(root->left);
        cout<<root->value<<" ";
        in_order(root->right);
    }
}

void post_order(Node* root){
    if(root != NULL){
        post_order(root->left);
        post_order(root->right);
        cout<<root->value<<" ";
    }
}

int main(){
    int length=8;
    int preorder[]={1,2,4,7,3,5,6,8};
    int inorder[]={4,7,2,1,5,3,8,6};
    Node* treeRoot=Construct(preorder,inorder,length);
    cout<<"Test pre_order"<<endl;
    pre_order(treeRoot);
    cout<<endl<<"Test in_order"<<endl;
    in_order(treeRoot);
    cout<<endl<<"Test post_order"<<endl;
    post_order(treeRoot);
}
/*
Test pre_order
1 2 4 7 3 5 6 8
Test in_order
4 7 2 1 5 3 8 6
Test post_order
7 4 2 5 8 6 3 1
Process returned 0 (0x0)   execution time : 0.259 s
Press any key to continue.
*/

根据前序和中序重建二叉树,布布扣,bubuko.com

根据前序和中序重建二叉树

标签:数据结构   算法   

原文地址:http://blog.csdn.net/dutsoft/article/details/26476961

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!