| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3424 人关注过本帖
标题:高手指点一下:已知前序与中序的遍历,递归建树求后序遍历!
只看楼主 加入收藏
鬼手刀客
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2008-10-19
结帖率:100%
收藏
 问题点数:0 回复次数:6 
高手指点一下:已知前序与中序的遍历,递归建树求后序遍历!
高手指点一下:已知前序与中序的遍历,递归建树求后序遍历!
主要想问一下递归建左子树与右子树时,参数怎么弄?
搜索更多相关主题的帖子: 遍历 建树 递归 
2008-11-16 20:51
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
已知前中建立二叉树,并实现后序,参数建议使用字符串,以及字符串的
范围,这样可以继续对子串递归进行已知前中建立二叉数,在递归函数中
主要是通过前序和中序介定出左子树和右子树的范围,

这是我写的代码,你可以参考,
///////////////////////////////////////////////////
//私有成员函数CreateByprein()
//通过前序序列和中序序列建立一棵二叉树
//输入的前序和中序序列必须一'#'结束
//pre是前序序列,in是中序序列,n为二叉树结点个数
///////////////////////////////////////////////////
template<class T>
BinTreeNode<T>* BinaryTree<T>::CreateByprein1(T* pre
                        ,T* in,int n)
{
    //创建的子树的根结点指针
    BinTreeNode<T>* p;

    //递归结束的条件
    if(n==0)
        //如果二叉树长度为0,返回空
        return NULL;

    T s=pre[0];             //在前序中的第一个元素就是根结点
    p=new BinTreeNode<T>(s);//根据取出的根结点元素创建根结点

    //在根据前序得到的根结点拆分中序序列的过程
    for(int m=0;m<n;m++)    //在中序的序列中查找根结点的位置
    {
        if(in[m]==s)        //m就是根结点在中序中的位置
            break;
    };

    //得到左子树的前序和中序
    T* lp=new T[m];             //得到左子树的前序
    for(int i=0;i<m;i++)
        lp[i]=pre[i+1];

    T* li=new T[m];             //得到左子树的中序
    for(i=0;i<m;i++)
        li[i]=in[i];

    T* rp=new T[n-m+1];         //得到右子树的前序
    for(i=0;i<n-m+1;i++)
        rp[i]=pre[i+m+1];

    T* ri=new T[n-m+1];         //得到右子树的中序
    for(i=0;i<n-m+1;i++)
        ri[i]=in[i+m+1];

    //递归创建左子树
    p->leftChild=CreateByprein1(lp,li,m);
    //递归创建右子树
    p->rightChild=CreateByprein1(rp,ri,n-m-1);

    //释放内存空间
    delete lp;
    delete li;
    delete rp;
    delete ri;
    //返回当前根结点的指针
    return p;
};
////////////////////////////CreateByprein()函数结束
2008-11-16 21:15
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
另外nuciewth斑竹也曾经写过的BinaryTree相关算法,前面有帖子,
里面也有他写的这个算法,比我写的简洁,你也可以搜索一下.
2008-11-16 21:17
鬼手刀客
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2008-10-19
收藏
得分:0 
谢谢你了!
2008-11-16 22:44
鬼手刀客
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2008-10-19
收藏
得分:0 
编了一下,还是搞不出正确结果....我这人活的太悲哀了
// creattree.c.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "string.h"
#define  N  40

typedef  struct node
{
        char    data;
        struct  node  *lchild;
        struct  node  *rchild;
}binnode;
typedef  binnode *bintree;


bintree  creat(char preorde[],char inorde[],int n)
{
        bintree t;
        char lp[N],li[N],rp[N],ri[N];
        int m,i;
        if(n==0)
                return NULL;
        t=(bintree)malloc(sizeof(binnode));
        t->data=preorde[0];
        for(m=0;m<n;m++)
        {
                if(inorde[m]=t->data )
                        break;//m就是根结点在中序的位置
        }
        //得到左子树的前序和中序
        for(i=0;i<m;i++)
                lp=preorde[i+1];
        for(i=0;i<m;i++)
                li=inorde;
        //得到右子树的前序和中序
        for(i=0;i<n-m+1;i++)
                rp=preorde[i+m+1];
        for(i=0;i<n-m+1;i++)
                ri=inorde[i+m+1];

        t->lchild =creat(lp,li,m);
        t->rchild =creat(rp,ri,n-m-1);

        

        return t;

}
void  postorde(bintree t)
{
        if(t)
        {
                postorde(t->lchild );
                postorde(t->rchild );
                printf("%c",t->data );
        }
}
void  preorde1(bintree t)
{
        if(t)
        {
                printf("%c",t->data );
                postorde(t->lchild );
                postorde(t->rchild );
               
        }
}
int main()
{
        char preorde[N],inorde[N];
        bintree t;
        int n;
        printf("请输入二叉树的前序遍历:");
        gets(preorde);
        printf("请输入二叉树的中序遍历:");
        gets(inorde);
        n=strlen(preorde);
        t=creat(preorde,inorde,n);/*建树*/
        printf("二叉树后序遍历:");
        postorde(t);
        printf("\n二叉树前序遍历:");
        preorde1(t);
        getch();
        return 0;
}
2008-11-17 09:01
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
你需要把你写的代码好好调试一下,你的代码中的好些函数,
我没有,所以也不方便给帮你调试.
2008-11-18 11:04
快速回复:高手指点一下:已知前序与中序的遍历,递归建树求后序遍历!
数据加载中...
 
   



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

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