版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
二叉树形状
代码演示
#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;
}