当前位置:网站首页>给定中序遍历和另外一种遍历方法确定一棵二叉树
给定中序遍历和另外一种遍历方法确定一棵二叉树
2022-08-01 19:49:00 【疯疯癫癫才自由】
给定中序遍历和另外一种遍历方法,可以得到一棵二叉树;原因是中序遍历的根节点可以把左右节点分成两半;而其他遍历方法都是给出子树头结点,不能把左右子树分开;因此另外三种遍历方法,任意给出两种遍历方法或者三种遍历方法一起都不能确定一棵二叉树;
1)给出中序遍历和前序遍历确定一棵二叉树:
假定前序遍历区间:[preL,preR];中序遍历:[midL,midR];
k为中序遍历的二叉树的根节点;那么不难得知:
左子树的个数:numl=k-midL;
前序遍历的左子树区间:[preL+1,preL+numl],中序遍历的左子树区间:[midL,midL+numl-1];
前序遍历的右子树区间:[preL+numl+1,preR],中序遍历的右子树区间:[mid+numl+1,midR];
/**
给定中序遍历和另外一种遍历方法,可以得到一棵二叉树;
原因是中序遍历的根节点可以把左右节点分成两半;而其他遍历方法都是给出子树头结点,不能把左右子树
分开;因此另外三种遍历方法,任意给出两种遍历方法或者三种遍历方法一起都不能确定一棵二叉树;
*/
/**
1)给出中序遍历和前序遍历确定一棵二叉树:
假定前序遍历区间:[preL,preR];中序遍历:[midL,midR];
k为中序遍历的二叉树的根节点;那么不难得知:
左子树的个数:numl=k-midL;
前序遍历的左子树区间:[preL+1,preL+numl],中序遍历的左子树区间:[midL,midL+numl-1];
前序遍历的右子树区间:[preL+numl+1,preR],中序遍历的右子树区间:[mid+numl+1,midR];
data:
7
4 1 3 2 6 5 7
1 2 3 4 5 6 7
*/
/**
#include <iostream>
using namespace std;
typedef struct TNode* BinTree;
struct TNode
{
int data;
BinTree lchild,rchild;
TNode()
{
lchild=rchild=NULL;
}
};
BinTree CreateTree_with_Pre_and_Mid(int preL,int preR,int midL,int midR);
void BehTraver(BinTree BT);
const int maxn=20;
int pre[maxn],mid[maxn];
int main()
{
int n;
cout << "输入树的结点数目:\n";
cin >> n;
cout << "输入前序遍历数据\n";
for(int i=0;i<n;++i)
cin >> pre[i];
cout << "输入中序遍历数据:\n";
for(int i=0;i<n;++i)
cin >> mid[i];
BinTree BT=CreateTree_with_Pre_and_Mid(0,n-1,0,n-1);
BehTraver(BT);
return 0;
}
BinTree CreateTree_with_Pre_and_Mid(int preL,int preR,int midL,int midR)
{
if(preL>preR)
return NULL;
BinTree BT=new TNode;
BT->data=pre[preL];
int k;
for(k=midL;k<=midR;++k)
{
if(mid[k]==pre[preL])
break;
}
int numl=k-midL;
BT->lchild=CreateTree_with_Pre_and_Mid(preL+1,preL+numl,midL,midL+numl-1);
BT->rchild=CreateTree_with_Pre_and_Mid(preL+numl+1,preR,midL+numl+1,midR);
return BT;
}
void BehTraver(BinTree BT)
{
if(BT)
{
BehTraver(BT->lchild);
BehTraver(BT->rchild);
printf("%d ",BT->data);
}
}
*/2)给出中序遍历和后序遍历确定一棵二叉树:
假定后序遍历区间:[behL,behR];中序遍历:[midL,midR];
k为中序遍历的二叉树的根节点;那么不难得知:
右子树的个数:numr=midR-k;
后序遍历的左子树区间:[behL,behR-numr-1],中序遍历的左子树区间:[midL,midR-numr-1];
后序遍历的右子树区间:[behR-numr,behR-1],中序遍历的右子树区间:[midR-numr+1,midR];
/**
2)给出中序遍历和后序遍历确定一棵二叉树:
假定后序遍历区间:[behL,behR];中序遍历:[midL,midR];
k为中序遍历的二叉树的根节点;那么不难得知:
右子树的个数:numr=midR-k;
后序遍历的左子树区间:[behL,behR-numr-1],中序遍历的左子树区间:[midL,midR-numr-1];
后序遍历的右子树区间:[behR-numr,behR-1],中序遍历的右子树区间:[midR-numr+1,midR];
data:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
*/
#include <iostream>
using namespace std;
typedef struct TNode* BinTree;
struct TNode
{
int data;
BinTree lchild,rchild;
TNode()
{
lchild=rchild=NULL;
}
};
BinTree CreateTree_with_Beh_and_Mid(int behL,int behR,int midL,int midR);
void PreTraver(BinTree BT);
const int maxn=20;
int beh[maxn],mid[maxn];
int main()
{
int n;
cout << "输入树的结点数目:\n";
cin >> n;
cout << "输入后序遍历数据\n";
for(int i=0;i<n;++i)
cin >> beh[i];
cout << "输入中序遍历数据:\n";
for(int i=0;i<n;++i)
cin >> mid[i];
BinTree BT=CreateTree_with_Beh_and_Mid(0,n-1,0,n-1);
PreTraver(BT);
return 0;
}
BinTree CreateTree_with_Beh_and_Mid(int behL,int behR,int midL,int midR)
{
if(behL>behR)
return NULL;
BinTree BT=new TNode;
BT->data=beh[behR];
int k;
for(k=midL;k<=midR;++k)
{
if(mid[k]==beh[behR])
break;
}
int numr=midR-k;
BT->lchild=CreateTree_with_Beh_and_Mid(behL,behR-numr-1,midL,midR-numr-1);
BT->rchild=CreateTree_with_Beh_and_Mid(behR-numr,behR-1,midR-numr+1,midR);
return BT;
}
void PreTraver(BinTree BT)
{
if(BT)
{
printf("%d ",BT->data);
PreTraver(BT->lchild);
PreTraver(BT->rchild);
}
}边栏推荐
- In the background of the GBase 8c database, what command is used to perform the master-slave switchover operation for the gtm and dn nodes?
- 不恰当Equatable协议==方法的实现对SwiftUI中@State修饰属性的影响
- Mobile Zero of Likou Brush Questions
- 漏刻有时文档系统之XE培训系统二次开发配置手册
- 第59章 ApplicationPart内置依赖注入中间件
- 【七夕特别篇】七夕已至,让爱闪耀
- 【蓝桥杯选拔赛真题47】Scratch潜艇游戏 少儿编程scratch蓝桥杯选拔赛真题讲解
- To drive efficient upstream and downstream collaboration, how can cross-border B2B e-commerce platforms release the core value of the LED industry supply chain?
- 为什么限制了Oracle的SGA和PGA,OS仍然会用到SWAP?
- 大神经验:软件测试的自我发展规划
猜你喜欢
随机推荐
为什么限制了Oracle的SGA和PGA,OS仍然会用到SWAP?
【周赛复盘】LeetCode第304场单周赛
终于有人把AB实验讲明白了
kingbaseV8R3和postgreSQL哪个版本最接近?
【kali-信息收集】(1.4)识别活跃的主机/查看打开的端口:Nmap(网络映射器工具)
面试突击70:什么是粘包和半包?怎么解决?
第55章 业务逻辑之订单、支付实体定义
第59章 ApplicationPart内置依赖注入中间件
1个小时!从零制作一个! AI图片识别WEB应用!
17. Load balancing
第57章 业务逻辑之业务实体与数据库表的映射规则定义
vtk体绘制代码报错的解决办法(代码在vtk7,8,9中都能运行),以及VTK数据集网站
【软考软件评测师】基于规则说明的测试技术下篇
【1374. 生成每种字符都是奇数个的字符串】
57: Chapter 5: Develop admin management services: 10: Develop [get files from MongoDB's GridFS, interface]; (from GridFS, get the SOP of files) (Do not use MongoDB's service, you can exclude its autom
Choosing the right DevOps tool starts with understanding DevOps
【蓝桥杯选拔赛真题47】Scratch潜艇游戏 少儿编程scratch蓝桥杯选拔赛真题讲解
Greenplum Database Source Code Analysis - Analysis of Standby Master Operation Tools
Does LabVIEW really close the COM port using VISA Close?
Pytorch模型训练实用教程学习笔记:二、模型的构建









