根据二叉树的前序序列和中序序列构造二叉树,具体算法怎么写 本帖最后由 huoyingfans 于 2010-06-14 12:03:38 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://blog.csdn.net/lazy_p/archive/2010/01/31/5275260.aspx请多指教,写的不好,呵呵! 这个问题应该发到数据结构与算法区。A是根结点,从中序序列找到A,把它划分为左右两棵子树。B是左子树根结点,从中序序列的左子树中找到B,然后划分为两棵子树。如此递归下去。 1楼的代码有问题啊,getPostOrder("ABCDEFG", "CBEDAFG"); System.out.println(postOrderReverse.reverse()); 输出为CEDBGFABADC 不对啊! 如何根据先序序列和后序序列生成二叉树,然后打印后序序列?? #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); } } 对不起啊,我的描述不够准确,以下是详细描述/** 内部树节点类 */ 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);//后序遍历生成的二叉树 我的程序输出来的结果是:CEDBGFA有问题吗?你这个答案是因为你没钱把前面我的测试数据给注释掉的原因,每次获得的时候必须要初始化postOrderReverse ,不然前面的答案会被累加的,呵呵! 如何用struts2来写个文件下载 关于Object类的源代码 关于多态的几种理解~~ 问个JAVA问题,冒似有点难! java从linux写内容到远程NT环境文本文件(怎样在局域网内跨操作系统写文件) try catch finally 执行顺序? 如何设置用JMF得到的视频的分辨率? 读取xml数据写入数据库的效率问题 环境变量设置有那么麻烦吗? java单例模式 findbug1.3.9运行问题 java如何生成这样的xml文件
请多指教,写的不好,呵呵!
A是根结点,从中序序列找到A,把它划分为左右两棵子树。
B是左子树根结点,从中序序列的左子树中找到B,然后划分为两棵子树。
如此递归下去。
System.out.println(postOrderReverse.reverse()); 输出为CEDBGFABADC 不对啊! 如何根据先序序列和后序序列生成二叉树,然后打印后序序列??
#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);
}
}
/** 内部树节点类 */
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);//后序遍历生成的二叉树
有问题吗?你这个答案是因为你没钱把前面我的测试数据给注释掉的原因,每次获得的时候必须要初始化postOrderReverse ,不然前面的答案会被累加的,呵呵!