中序层序建立二叉树
来源:互联网 发布:java 短信猫程序 编辑:程序博客网 时间:2024/05/22 08:07
思路:以结构体数组存储中序、层序数组信息。层序结构体数组信息包括数据元素、该数据元素在中序数组中的位置;中序数组信息包括数据元素、父母位置、左右孩子指针。建立标记数组(bool型),中序数组中,按层序数组中数据位置并以数组界限和标记元素界限为界先后查找父母,查找后的元素被标记。按照中序数组中父母信息建立二叉树即可。
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
//存储层序数组结构体
struct LevNode
{
int lev;
int locin;
};
//存储中序数组结构体
struct InNode
{
int in;
int parent;
InNode *lchild;
InNode *rchild;
};
int search(int lev, InNode in[], int n)
{
int i;
for(i = 0; i < n; i++)
{
if(lev == in[i].in)
{
break;
}
}
return i;
}
void InitLev(LevNode lev[], InNode in[], int n)
{
int k, i = 0;
while(i < n)
{
k = search(lev[i].lev, in, n);
if(i == 0)
{
in[k].parent = -1;
}
lev[i].locin = k;
i++;
}
}
void InitIn(LevNode lev[], InNode in[], int n)
{
int j = 0, t;
bool *visit = (bool*)malloc(sizeof(bool) * n);
//建立标记数组
for(int i = 0; i < n; i++)
{
visit[i] = false;
}
for(int i = 0; i < n; i++)
{
j = lev[i].locin;
t = j;
visit[j] = true;
j--;
//按照标记数组界限与数组本身界限查找父母位置
while(j >= 0&&visit[j] == false)
{
in[j].parent = lev[i].locin;
j--;
}
t++;
while(t < n&&visit[t] == false)
{
in[t].parent = lev[i].locin;
t++;
}
}
printf("lev:/n");
for(int i = 0; i < n; i++)
{
printf("%d %d/n", lev[i].lev, lev[i].locin);
}
printf("in:/n");
for(int i = 0; i < n; i++)
{
printf("%d %d/n", in[i].in, in[i].parent);
}
}
void CrtBT(LevNode lev[], InNode in[], int n, InNode**T)
{
int i, t;
InNode *p = in;
for(i = 0; i < n; i++)
{
T[i] = p;
p++;
}
for(i = 0; i < n; i++)
{
if(in[i].parent == -1)
{
;
}
else if(in[i].parent > i)
{
t = in[i].parent;
T[t]->lchild = T[i];
}
else if(in[i].parent < i)
{
t = in[i].parent;
T[t]->rchild = T[i];
}
}
}
void PreOrderTraverse(InNode*T)
{
if(T != NULL)
{
printf("%d ", T->in);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(InNode *T)
{
if(T != NULL)
{
InOrderTraverse(T->lchild);
InOrderTraverse(T->rchild);
printf("%d ", T->in);
}
}
int main()
{
int length, k;
scanf("%d", &length);
LevNode *lev = (LevNode*)malloc(sizeof(LevNode)*length);
InNode *in = (InNode*)malloc(sizeof(InNode)*length);
for(int i = 0; i < length; i++)
{
scanf("%d", &lev[i].lev);
}
for(int i = 0; i < length; i++)
{
scanf("%d", &in[i].in);
}
InitLev(lev, in, length);
InitIn(lev, in, length);
//建立二级指针,建立指针数组指向各个数据元素
InNode**T=(InNode**)malloc(sizeof(InNode*)*length);
CrtBT(lev, in, length, T);
//找到二叉树根节点遍历
k = search(lev[0].lev, in, length);
PreOrderTraverse(T[k]);
printf("/n");
InOrderTraverse(T[k]);
return 0;
}
- 中序层序建立二叉树
- 递归建立二叉树
- 二叉树的建立
- 二叉树建立
- 后序中序建立二叉树
- 先序中序建立二叉树
- 二叉树的建立
- 二叉树的建立
- 二叉树 - 建立
- 二叉树的建立
- 二叉树的建立
- 如何建立二叉树
- 二叉树 建立 遍历
- 二叉树的建立
- 二叉树的建立
- 建立二叉树
- 二叉树的建立
- 二叉树的建立
- vi 编辑器 使用(Linux/Unix)
- 一个很奇怪的问题
- 获取当前登录者的信息
- 数据库知多少 - 随便搜集点, 还真不少
- 进程间通信(IPC)——信号量、共享内存、消息队列
- 中序层序建立二叉树
- android 线程间的通信
- 系统维护
- Linux安全检查方法
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientSc
- 条带化(Striping)
- 通用网游服务器
- int 13h 参数大全
- LG欲与Intel联合 MeeGo雏形下月见分晓