C++知道先序序列和中序序列构造二叉树

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/SoftpaseFar/article/details/102587043

二叉树形状

在这里插入图片描述

代码演示

#include <iostream>
#include<vector>

using namespace std;

//树的节点信息
struct TreeNode {
    char val;
    TreeNode *left;
    TreeNode *right;

    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

//知道先序序列和中序序列递归构造二叉树
TreeNode *reCreateTree(vector<char> pre, vector<char> vin) {

    if (pre.size() == 0 && vin.size() == 0) {
        return NULL;
    }

    TreeNode *root = new TreeNode(pre[0]);
    int i, j;

    //在中序遍历序列中找到先序第一个位置i
    for (i = 0; i < vin.size(); ++i) {
        if (vin[i] == pre[0]) {
            break;
        }
    }

    //将先序序列和中序序列分为,左侧先序序列中序序列,和右侧先序序列中序序列
    vector<char> lpre, lvin, rpre, rvin;
    for (j = 1; j <= i; ++j) {
        lpre.push_back(pre[j]);
    }
    for (j = 0; j < i; ++j) {
        lvin.push_back(vin[j]);
    }
    for (j = i + 1; j < pre.size(); ++j) {
        rpre.push_back(pre[j]);
    }
    for (j = i + 1; j < vin.size(); ++j) {
        rvin.push_back(vin[j]);
    }

    //递归生成root的左右子树
    root->left = reCreateTree(lpre, lvin);
    root->right = reCreateTree(rpre, rvin);
    return root;

}


//访问节点
void Visit(TreeNode *T) {
    cout << T->val << " ";
}

//二叉树的后续遍历算法
void PostOrder(TreeNode *T) {
    if (T != NULL) {
        PostOrder(T->left);
        PostOrder(T->right);
        Visit(T);
    }
}


int main() {
    //根节点
    TreeNode *root;

    //测试用例
    vector<char> pre = {'A', 'B', 'D', 'C', 'E', 'F'};
    vector<char> vin = {'D', 'B', 'A', 'E', 'C', 'F'};
    root = reCreateTree(pre, vin);

    //后序遍历检验结果
    PostOrder(root);


    return 0;
}

结果显示

猜你喜欢

转载自blog.csdn.net/SoftpaseFar/article/details/102587043