如何通过中序和层序序列建立二叉树

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;
}

参考

根据中序和层序建立二叉树

以上是关于如何通过中序和层序序列建立二叉树的主要内容,如果未能解决你的问题,请参考以下文章

通过遍历序列构造二叉树(扩展二叉树的先序先序和中序后序和中序层序和中序)附可执行完整代码

二叉树的非递归遍历(前序,中序,后序和层序遍历)

二叉树的建立和遍历

建立二叉树的二叉链表表示,实现二叉树的先序、中序、后序和按层次遍历,统计并输出结点个数。

输入后序和中序,构造二叉树,并输出该二叉树的层序前序中序后序遍历结构;输入后序和中序,构造二叉树,并输出该二叉树的层序前序中序后序遍历结构

二叉树:前序遍历,中序遍历,后序遍历和层序遍历