如何通过中序和层序序列建立二叉树
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过中序和层序序列建立二叉树相关的知识,希望对你有一定的参考价值。
有这样一棵二叉树
根据节点个数 9
层序遍历结果 15 23 8 16 2 32 28 7 11
中序遍历结果 16 23 7 32 11 2 28 15 8
预期先序输出 15 23 16 2 32 7 11 28 8
运行结果
这个过程和建立二叉查找树(BST)的过程是非常相像的,将laSq[laIndex]插入到根为root的子树中,如果当前根节点为空,就是要新建结点的位置,如果不为空,根据二者的值在中序序列中的排序,选择将laSq[laIndex]插入到左子树/右子树中。
注意&不可缺少。
代码
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
#include<stdlib.h>
#include<time.h>
#include<vector>
#include<set>
#include<string>
#include<tr1/unordered_map>
using namespace std;
using namespace std::tr1;
typedef long long LL;
const int maxn = 10007;
const int MOD = 1000000007;
const int INF = 1000000000;//INF:下确界
const LL SUP = (1LL<<63)-1;//SUP:上确界
const double eps = 1e-5;
int laSq[maxn],inSq[maxn];
int pos[maxn];//记录数值在中序序列中的位置
struct Node{
int v;
Node *lchild,*rchild;
};
void insert(int laIndex,Node* &root){
if(root==NULL){
root = new Node;
root->v = laSq[laIndex];
root->lchild = root->rchild = NULL;
return;
}
if(pos[root->v]<pos[laSq[laIndex]])insert(laIndex,root->rchild);
else insert(laIndex,root->lchild);
}
int n;
void DFS(Node* root){
if(root==NULL)return;
printf("%d%s",root->v,root->v==inSq[n-1]?"\\n":" ");
if(root->lchild!=NULL)DFS(root->lchild);
if(root->rchild!=NULL)DFS(root->rchild);
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>laSq[i];
}
for(int i=0;i<n;i++){
cin>>inSq[i];
pos[inSq[i]] = i;
}
Node* root = NULL;
for(int i=0;i<n;i++)insert(i,root);
DFS(root);
return 0;
}
参考
以上是关于如何通过中序和层序序列建立二叉树的主要内容,如果未能解决你的问题,请参考以下文章
通过遍历序列构造二叉树(扩展二叉树的先序先序和中序后序和中序层序和中序)附可执行完整代码
建立二叉树的二叉链表表示,实现二叉树的先序、中序、后序和按层次遍历,统计并输出结点个数。
输入后序和中序,构造二叉树,并输出该二叉树的层序前序中序后序遍历结构;输入后序和中序,构造二叉树,并输出该二叉树的层序前序中序后序遍历结构