| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 522 人关注过本帖
标题:求教!!!!
只看楼主 加入收藏
石头123
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-12-8
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:3 
求教!!!!
有以下程序,我实在是弄不明白递归创建的具体过程是怎样的,请各位大哥不吝指教,把递归创建的过程讲一下
比如说 输入序列:1 2 3 -1 -1 -1 4 5 -1 -1 6 -1 -1
template <class T>
void BinaryTree<T>::CreateBiTree(T end)
{    //创建一棵二叉树:先序序列的顺序输入数据,end为结束的标志
    cout<<"请按先序序列的顺序输入二叉树,-1为空指针域标志:"<<endl;
    BTNode<T>*p;
    T x;
    cin>>x;                //输入根结点的数据
    if(x==end) return ;    //end 表示指针为空,说明树为空
    p=new BTNode<T>;    //申请内存
    if(!p)
    {
        cout<<"申请内存失败!"<<endl;
        exit(-1);//申请内存失败退出
    }
    p->data=x;
    p->lchild=NULL;
    p->rchild=NULL;
    BT=p;            //根结点
    create(p,1,end);//创建根结点左子树,1为标志,表示左子树
    create(p,2,end);//创建根结点右子树,2为标志,表示右子树
}

template <class T>
static int create(BTNode<T>*p,int k,T end)
{//静态函数,创建二叉树,k为创建左子树还是右子树的标志,end为空指针域的标志
    BTNode<T>*q;
    T x;
    cin>>x;
    if(x!=end)
    {                        //先序顺序输入数据
        q=new BTNode<T>;
        q->data=x;
        q->lchild=NULL;
        q->rchild=NULL;
        if(k==1) p->lchild=q;    //q为左子树
        if(k==2) p->rchild=q;    //p为右子树
        create(q,1,end);        //递归创建左子树
        create(q,2,end);        //递归创建右子树
    }
    return 0;
}
搜索更多相关主题的帖子: return 二叉树 
2012-12-11 10:21
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:10 
没有什么好说的了吧,已经有注释,很详细了

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-12-11 12:24
石头123
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-12-8
收藏
得分:0 
回复 2楼 yuccn
1,if(x==end) return ;这条语句return空格是什么意思,它怎么就能说明树为空呢?
2,以前面的序列:1 2 3 -1 -1 -1 4 5 -1 -1 6 -1 -1 为例,遇到了第一个-1 时,执行return 0对吧;return 0起什么作用?那接下来是执行哪一条语句呢?我就是不明白后面的具体流程,怎么一步一步地建成二叉树?还希望高手能耐心地指导一下?
2012-12-11 21:42
小强。小强
Rank: 2
来 自:山西大同
等 级:论坛游民
帖 子:42
专家分:56
注 册:2012-11-15
收藏
得分:10 
程序代码:
void BinaryTree<T>::CreateBiTree(T end)
{    //创建一棵二叉树:先序序列的顺序输入数据,end为结束的标志
    cout<<"请按先序序列的顺序输入二叉树,-1为空指针域标志:"<<endl;
    BTNode<T>*p;
    T x;
    cin>>x;                //输入根结点的数据
    if(x==end) return ;    //end 表示指针为空,说明树为空
    p=new BTNode<T>;    //申请内存
    if(!p)
    {
        cout<<"申请内存失败!"<<endl;
        exit(-1);//申请内存失败退出
    }
    p->data=x;
    p->lchild=NULL;
    p->rchild=NULL;

    BT=p;            //根结点
    create(p,1,end);//创建根结点左子树,1为标志,表示左子树|这两段是进行递归
    create(p,2,end);//创建根结点右子树,2为标志,表示右子树|
}

这段语句意思是
先让X=1,给申请一个内存然后把X给了内存date,这时他他没有左右字树,然后到creat(p,1,end),意思是又到了前面再重新申请内存+赋值,这就是上一个的左孩子,如果这个左孩子还有左孩子在进行同样的操作,如果你没有的话就申请一个内存为根节点的右孩子且赋值,下次再申请内存给他的左孩子,依次往下!直到你申请的内存里是空的时结束!
                          学理的文字功底不行见谅!如果有错误见谅!!!
2012-12-12 13:36
快速回复:求教!!!!
数据加载中...
 
   



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

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