| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 903 人关注过本帖
标题:[一起讨论]~~由两种遍历次序构建二叉树~~
只看楼主 加入收藏
fay
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-3-23
收藏
 问题点数:0 回复次数:1 
[一起讨论]~~由两种遍历次序构建二叉树~~
3种遍历次序中,只有先根+中根可以唯一地确定一棵二叉树。其他的两种都可以举反例来证明,我昨天都画出来了。但是建立本身怎么写呢?

我有这样的思路:
由先根起,每一个数字都找到它在中根序列中的位置,找出他在中根序列中最近的左右的已被放进树里的元素(设为A,B)。若B左子女空 && A右子女满,则放在B左子女处。反之放A右子女。放进之后删除记录。

可是具体实现却出现问题……我们要用左右指针的二叉树写……就有点手足无措……


希望大家给我思路!一起交流!谢谢!
搜索更多相关主题的帖子: 二叉树 历次序 构建 左子女 序列 
2006-04-15 10:53
renhu
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2005-11-27
收藏
得分:0 

#include<iostream>
using namespace std;

#define N 7

typedef struct Tnode{
struct Tnode *lchild;
struct Tnode *rchild;
char data;
}*BiTree;

void Rebuild(BiTree &T,char A[N+1],char B[N+1],int &count,int low,int high)
{
if(count<=N)
{
if(low>high)
{
T=NULL;
count--;
}
else
{
T=(BiTree)malloc(sizeof(struct Tnode));
T->data=A[count];
for(int i=low;i<=high && B[i]!=A[count];i++);//找到根节点
Rebuild(T->lchild,A,B,++count,low,i-1);//这里的count++与++count有区别
Rebuild(T->rchild,A,B,++count,i+1,high);
}
}
else
T=NULL;
}

void print(BiTree T,int k)
{
if(T)
{
k+=5;
print(T->rchild,k);
for(int i=0;i<k;i++)
cout<<" ";
cout<<T->data<<endl;
print(T->lchild,k);
}

}


int main()
{
BiTree t;

int count=1;
char A[N+2]={'0','1','2','4','5','3','6'};//前序
char B[N+2]={'0','4','2','5','1','3','6'};//中序

Rebuild(t,A,B,count,1,N);
print(t,0);

return 0;
}

2006-04-16 19:02
快速回复:[一起讨论]~~由两种遍历次序构建二叉树~~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018918 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved