注册 登录
编程论坛 数据结构与算法

求教!!!!

石头123 发布于 2012-12-11 10:21, 522 次点击
有以下程序,我实在是弄不明白递归创建的具体过程是怎样的,请各位大哥不吝指教,把递归创建的过程讲一下
比如说 输入序列: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;
}
3 回复
#2
yuccn2012-12-11 12:24
没有什么好说的了吧,已经有注释,很详细了
#3
石头1232012-12-11 21:42
回复 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起什么作用?那接下来是执行哪一条语句呢?我就是不明白后面的具体流程,怎么一步一步地建成二叉树?还希望高手能耐心地指导一下?
#4
小强。小强2012-12-12 13:36
程序代码:
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),意思是又到了前面再重新申请内存+赋值,这就是上一个的左孩子,如果这个左孩子还有左孩子在进行同样的操作,如果你没有的话就申请一个内存为根节点的右孩子且赋值,下次再申请内存给他的左孩子,依次往下!直到你申请的内存里是空的时结束!
                          学理的文字功底不行见谅!如果有错误见谅!!!
1