根据二叉树的前序序列和中序序列构造二叉树,具体算法怎么写

huoyingfans 2010-06-14 12:02:46
前序序列: A B C D E F G
中序序列: C B E D A F G

要具体代码。
...全文
1189 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
huoyingfans 2010-06-17
  • 打赏
  • 举报
回复
本人比较懒。
宅男小何 2010-06-14
  • 打赏
  • 举报
回复
http://blog.csdn.net/lazy_p/archive/2010/01/31/5275260.aspx
请多指教,写的不好,呵呵!
宅男小何 2010-06-14
  • 打赏
  • 举报
回复
呵呵,可以在线交流下,呵呵!
huoyingfans 2010-06-14
  • 打赏
  • 举报
回复
确实如此啊!不过程序并没有此相关注释!
赞一个!
宅男小何 2010-06-14
  • 打赏
  • 举报
回复
我的程序输出来的结果是:CEDBGFA
有问题吗?你这个答案是因为你没钱把前面我的测试数据给注释掉的原因,每次获得的时候必须要初始化postOrderReverse ,不然前面的答案会被累加的,呵呵!
宅男小何 2010-06-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 huoyingfans 的回复:]
1楼的代码有问题啊,getPostOrder("ABCDEFG", "CBEDAFG");
System.out.println(postOrderReverse.reverse());

输出为CEDBGFABADC 不对啊!

如何根据先序序列和后序序列生成二叉树,然后打印后序序列??
[/Quote]
那答案应该是?
huoyingfans 2010-06-14
  • 打赏
  • 举报
回复
对不起啊,我的描述不够准确,以下是详细描述
/** 内部树节点类 */
private static class TreeNode {
Object element;// 结点的信息

TreeNode left;// 结点的左孩子

TreeNode right;// 结点的右孩子

public TreeNode(Object o) {
element = o;
}
}

String preorder="ABCDEFG";//前序遍历序列
String inorder = "CBEDAFG";//中序遍历序列

public void createBinaryTree(String preorder,String inorder);//根据前序和中序生成二叉树
public void postorder(TreeNode root);//后序遍历生成的二叉树
24K純帥 2010-06-14
  • 打赏
  • 举报
回复

#include <iostream>
#include <queue>

using namespace std;

struct BiNode
{
char data;
BiNode *lchild, *rchild;
};
typedef BiNode *BiTree;

int CreateBiTree(BiTree &T, const char *s1, const char *s2, int len)
{
if (len<=0)
{
T = NULL;
return 1;
}
else
{
T = new BiNode;
T->data = *s1;
int i;
for ( i=0; i<len; i++) if (s2[i]==*s1) break;
CreateBiTree(T->lchild, s1+1, s2, i);
CreateBiTree(T->rchild, s1+i+1, s2+i+1, len-(i+1));
}
return 1;
}

int DestroyBiTree(BiTree &T)
{
if (T==NULL) return 1;
DestroyBiTree(T->lchild);
DestroyBiTree(T->rchild);
delete T;
T = NULL;
return 1;
}

int ATraverse(BiTree &T)
{
if (T==NULL) return 1;
ATraverse(T->lchild);
ATraverse(T->rchild);
cout<<T->data;
return 1;
}

int LevelTraverse(BiTree &T)
{
if (T==NULL) return 1;
queue<BiNode *> Q;
Q.push(T);
while (!Q.empty())
{
BiNode *p = Q.front(); Q.pop();
cout<<p->data;
if (p->lchild!=NULL) Q.push(p->lchild);
if (p->rchild!=NULL) Q.push(p->rchild);
}
return 1;
}

main()
{
char a[2000],b[2000];
while(cin>>a>>b)
{
BiTree T;
int count=0;
int n;
for(n=0;a[n]!='\0';n++);
CreateBiTree(T,a,b,n);
ATraverse(T);
cout<<" ";
LevelTraverse(T);
cout<<endl;
DestroyBiTree(T);
}
}
huoyingfans 2010-06-14
  • 打赏
  • 举报
回复
1楼的代码有问题啊,getPostOrder("ABCDEFG", "CBEDAFG");
System.out.println(postOrderReverse.reverse());

输出为CEDBGFABADC 不对啊!

如何根据先序序列和后序序列生成二叉树,然后打印后序序列??
Jether 2010-06-14
  • 打赏
  • 举报
回复
这个问题应该发到数据结构与算法区。
A是根结点,从中序序列找到A,把它划分为左右两棵子树。
B是左子树根结点,从中序序列的左子树中找到B,然后划分为两棵子树。
如此递归下去。

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧