#jx1002. 构建树
构建树
一、先序中序构建树
#include<iostream>
using namespace std;
string pre,mid;
struct node{
char data;
int left,right;//左右孩子编号
}BTree[30];
int p=0;
//根据先序和中序序列构造树
int getTree(int pl,int pr,int ml,int mr){
if(pl>pr) return -1;
int t=p++;
BTree[t].data=____(1)_____;
int i=ml;
while(i<=mr&&mid[i]!=pre[pl]) i++;
//计算左子树的长度
int len=____(2)_____;
//构建左右子树
BTree[t].left=getTree(pl+1,____(3)_____,ml,i-1);
BTree[t].right=getTree(___(4)____,___(5)____,i+1,mr);
return t;
}
int main(){
cin>>pre>>mid;
int n=pre.size();
int root=getTree(0,n-1,0,n-1);
cout<<"二叉树的结点数:"<<p;
return 0;
}
第 1 题
(1)处填写{{ input(1) }}
第 2 题
(2)处填写{{ input(2) }}
第 3 题
(3)处填写{{ input(3) }}
第 4 题
(4)处填写{{ input(4) }}
第 5 题
(5)处填写{{ input(5) }}
二、中序后序构建树后求先序序列
#include<bits/stdc++.h>
using namespace std;
struct node{
char data;//结点信息
int left,right;//左孩子、右孩子结点编号
}BTree[30];
string mid,post;
//根据中序、后序序列构造二叉树
//pl,pr后序序列左右边界 ml,mr中序序列左右边界
int p=0;//数组下标
int getTree(int pl,int pr,int ml,int mr){
if(pl>pr) return ___(1)___;
int t=p++;
//确定根节点
BTree[t].data=___(2)___;
int i=ml;//i中序序列中根节点下标
while(i<=mr&&mid[i]!=post[pr]) i++;
int len=___(3)___;//求左子树长度
//构建左子树,返回值是左子树根节点编号
BTree[t].left=getTree(pl,___(4)___,ml,i-1);
//构建右子树,返回值是右子树根节点编号
BTree[t].right=getTree(pl+len,___(5)___,i+1,mr);
return t;//返回结点编号
}
//对某棵二叉树进行先序遍历
void preOrder(int root){ //root根结点在数组中编号
if(root>=0){
cout<<BTree[root].data;//输入根节点的数据
preOrder(BTree[root].left); //先序遍历左子树
preOrder(BTree[root].right); //先序遍历右子树
}
}
int main(){
//输入中序序列和后序序列
cin>>mid>>post;
int n=mid.size();
getTree(0,n-1,0,n-1);
//输出先序遍历
preOrder(0);
return 0;
}
第 6 题
(1)处填写{{ input(6) }}
第 7 题
(2)处填写{{ input(7) }}
第 8 题
(3)处填写{{ input(8) }}
第 9 题
(4)处填写{{ input(9) }}
第 10 题
(5)处填写{{ input(10) }}
相关
在以下作业中: