您的位置:首页 > 理论基础 > 数据结构算法

二叉树的遍历

2016-04-04 21:02 211 查看
1、前序遍历(父节点,左孩子,右孩子)。

#define N 7 //树节点个数
int tree
={a,b,c,d,e,f,g}; //自定义节点编号

void foreIterator(int root)
{
if(root >= N)
return;
printf("%d ",tree[root]); //这里可以替换成自己的处理函数
foreIterator(2*root+1);
foreIterator((2*root+2));
}
//下面的函数省略N tree定义
//调用时foreIterator(0);这里的root指数组下标,从0开始


2、中序遍历(左孩子,父节点,右孩子)。

void middIterator(int root)
{
if(root >= N)
return;
middIterator(2*root+1);
printf("%d ",tree[root]);
middIterator((2*root+2));
}


3、后序遍历(左孩子,右孩子,父节点)。

void backIterator(int root)
{
if(root >= N)
return;
backIterator(2*root+1);
backIterator((2*root+2));
printf("%d ",tree[root]);
}


提醒:根据前序遍历和后序遍历结果不可以推导出原来的二叉树。根据中序遍历和其它两种任意一个都可以推导出二叉树。

1、根据中序、前序求出原来的树。

#define N 7

int fore
={0,1,3,4,2,5,6};
int midd
={3,1,4,0,5,2,6};
int back
={3,4,1,5,6,2,0};
int tree
={-1,-1,-1,-1,-1,-1,-1};

//在方法内将会使用上面定义的内容,也可以使用其它方式
void treeFromMF(int ms,int me,int fs,int index)
{
/*
参数含义:
ms -> 中序数组表示的树的起点
me -> 中序数组表示的树的终点
fs -> 前序数组表示的树的起点
index -> tree数组索引
*/
if(ms<0||ms>=N||me<0||me>=N||fs<0||fe>=n||index<0||index>=N)
return;

int i;
for(i=ms; i<=me; i++) //根据前序数组将中序数组拆分为左子树右子树
if(midd[i] == fore[fs])
break;
tree[index] = fore[fs]; //将父元素保存进tree
treeFromFM(ms,i-1,fs+1,2*index+1); //计算左子树起终点
treeFromFM(i+1,me,fs+i-ms+1,2*index+2);//计算右子树
}


2、根据中序、后序求出原来的树。

void treeFromMB(int ms,int me,int be,int index)
{
/*
参数含义:
ms me index -> 同上
be -> 后序数组终点
*/
if(ms<0||ms>=N||me<0||me>=N||be<0||be>=N||index<0||index>=N)
return;
int i;
for(i=ms; i<=me; i++)
if(midd[i] == back[be])
break;
tree[index] = back[be];
treeFromBM(ms,i-1,be+i-me-1,2*index+1); // be+i-me-1
treeFromBM(i+1,me,be-1,2*index+2);//be-me+i
}


注意:两个函数的第三个参数的不同含义。

如给出的三个数组,调用treeFromMF需要传递(0,6,0,0);而调用treeFromMB需要传递(0,6,6,0)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息