003.二叉树的创建
前序+中序创建二叉树(确定后序)
子串的切分:\(pre[L_1,R_1]\)和\(in[L_2,R_2]\)中,可以锁定根节点的值\(root=pre[L_1]\)和根节点在\(in\)序列的下标\(p(0-based)\)
进而可以确定左子树的大小为\(left\_size = p - L_2\),然后递归的创建左子树和右子树
左子树的区间:\(pre[L_1+1,L_1+left\_size]\)和\(in[L_2,p-1]\)
右子树的区间:\(pre[L_1+left\_size+1,R_1]\)和\(in[p+1,R_2]\)
#include<iostream>
#include<sstream>
#include<string>
using namespace std;
string PreOrder, InOrder;
void build(string Pre, int L1, int R1, string In, int L2, int R2)
{
if (L1 > R1) return;
char root = Pre[L1];
int p = 0;
for (int i = L2; i <= R2; i++)
{
if (In[i] == root)
{
p = i;
break;
}
}
int left_size = p - L2; // 左子树节点数量
build(Pre, L1 + 1, L1 + left_size, In, L2, p - 1);
build(Pre, L1 + left_size + 1, R1, In, p + 1, R2);
cout << root;
}
int main()
{
while (cin >> PreOrder >> InOrder)
{
int n = PreOrder.size();
build(PreOrder, 0, n - 1, InOrder, 0, n - 1);
cout << endl;
}
return 0;
}
后序+中序创建二叉树(确定前序)
同样的思路,不同的切分方法:\(in[L_1,R_1]\)和\(post[L_2,R_2]\)中\(root=post[R_2]\),\(root\)在\(in\)序列中的下标为\(p\)
同样可以确定左子树的大小为\(left\_size = p - L_1\),然后递归的创建左子树和右子树
左子树的区间:\(in[L_1,p-1]\)和\(post[L_2,L_2+left\_size-1]\)
右子树的区间:\(in[p+1,R_1]\)和\(post[L_2+left\_size,R_2-1]\)
#include<iostream>
#include<sstream>
#include<string>
using namespace std;
string PostOrder, InOrder;
void build(string In, int L1, int R1, string Post, int L2, int R2)
{
if (L1 > R1) return;
char root = Post[R2];
int p = L1;
while (In[p] != root) p++;
int left_size = p - L1;
cout << root << " ";
build(In, L1, p - 1, Post, L2, L2 + left_size - 1);
build(In, p + 1, R1, Post, L2 + left_size, R2 - 1);
}
int main()
{
cin >> InOrder >> PostOrder;
int n = InOrder.size();
build(InOrder, 0, n - 1, PostOrder, 0, n - 1);
return 0;
}
层序+中序创建二叉树
转载自出处
#include<map>
#define MAX_SIZE 100
// 定义层序序列和先序序列
ElemType levelOrder[MAX_SIZE], inOrder[MAX_SIZE];
// 定义记录中序序列各个结点位置的字典(映射):{结点值:结点在中序序列中的编号}
map<ElemType, int> inPos;
// 在指定levelIndex位置创建root结点
void CreateBiTreeNode(BiTreeNode*& root, int levelIndex){
// 如果走到了现有的树的底部,则新创建结点(构造祖先结点)
if(root == nullptr){
root = (BiTreeNode*)malloc(sizeof(BiTreeNode));
root->data = levelOrder[levelIndex];
root->lchild = root->rchild = nullptr;
return;
}
// 如果层序中的结点在中序序列中的位置靠左,
// 表明该结点在其根结点的左边,让根结点移向其左孩子
else if(inPos[root->data] >= inPos[levelOrder[levelIndex]]){
CreateBiTreeNode(root->lchild, levelIndex);
}
// 否则表明在根结点的右边,让根结点移向其右孩子
else{
CreateBiTreeNode(root->rchild, levelIndex);
}
}
// 创建二叉树
void CreateBiTree(BiTree& BT){
for(int i=0; i<n; i++){
CreateBiTreeNode(BT, i);
}
}

浙公网安备 33010602011771号