【C++】根据二叉树的前序遍历和中序遍历构建一棵完整的树

使用递归,通过前序遍历和中序遍历构建一棵完整的树,并返回树根。

代码比较好懂,看看注释就ok了。

#include <iostream>
#include <vector>
using namespace std;
struct Node{//****************************************************二叉树的节点
    int ele;
    Node *left;
    Node *right;
    Node(int n = 0){
        ele = n;
        left = NULL;
        right = NULL;
    } 
};
Node* plantTree(vector<int> pre,vector<int> in)
{
    if(pre.size()==0||in.size()==0||pre.size()!=in.size())//******递归基和错误条件 
        return NULL;

    Node* root = new Node(pre[0]);//******************************创建根节点 
    int index = 0;
    vector<int> left_pre,right_pre,left_in,right_in;//***********下面的递归需要的参数 

    for(int i = 0;i<in.size();i++)//*****************************在中序遍历里面找到根节点 
        if(root->ele==in[i])
            index = i;

    for(int i = 0;i<index;i++)
    {
        left_pre.push_back(pre[i+1]);//*************************根节点左子树前序遍历序列 
        left_in.push_back(in[i]);//*****************************根节点右左子树中序遍历序列       
    }

    for(int j = index+1;j<pre.size();j++)
    {
        right_pre.push_back(pre[j]);//**************************根节点右子树前序遍历序列 
        right_in.push_back(in[j]);//****************************根节点右子树中序遍历序列 
    }

    root->left = plantTree(left_pre,left_in);//*****************递归构建左子树 
    root->right = plantTree(right_pre,right_in);//**************递归构建右子树 
    return root;

}
void inorder(Node *root)//**************************************中序遍历
{
    if(root==NULL)return;
    inorder(root->left);
    cout<<root->ele<<" ";
    inorder(root->right);
}
int main()
{
    Node *root = new Node(0);//**********************************构建一棵树
    root->left = new Node(1);
    root->right = new Node(2);
    root->left->left = new Node(3);
    root->left->right = new Node(4);
    root->right->left = new Node(5);
    root->right->right = new Node(6); 

    vector<int> pre,in;

    pre.push_back(0);//*****************************************这棵树的前序遍历
    pre.push_back(1);
    pre.push_back(3);
    pre.push_back(4);
    pre.push_back(2);
    pre.push_back(5);
    pre.push_back(6);

    in.push_back(3);//*******************************************这棵树的中序遍历
    in.push_back(1);
    in.push_back(4);
    in.push_back(0);
    in.push_back(5);
    in.push_back(2);
    in.push_back(6);

    Node *newroot = plantTree(pre,in);//**************************通过前序遍历和中序遍历构建一棵树

    cout<<"old tree inorder:";//**********************************中序遍历输出旧树和新树,验证结果
    inorder(root);
    cout<<endl;

    cout<<"new tree inorder:";
    inorder(newroot);
    cout<<endl;

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值