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号