| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3157 人关注过本帖
标题:关于二叉树建立(递归)不明白啊。
只看楼主 加入收藏
ctw888
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-5-22
收藏
 问题点数:0 回复次数:16 
关于二叉树建立(递归)不明白啊。
假设虚结点输入时以空格字符表示,相应的构造算法为:
     void CreateBinTree (BinTree *T)
      { //构造二叉链表。T是指向根指针的指针,故修改*T就修改了实参(根指针)本身
        char ch;
        if((ch=getchar())=='') *T=NULL; //读人空格,将相应指针置空
        else{ //读人非空格
              *T=(BinTNode *)malloc(sizeof(BinTNode)); //生成结点
              (*T)->data=ch;
              CreateBinTree(&(*T)->lchild); //构造左子树
              CreateBinTree(&(*T)->rchild); //构造右子树
             }
      }


疑问:
1、如果读入的是空,执行*T=NULL,其作是干什么?
2、如果读入的不是空,则分配一个空间,生成结点,然后赋值。而构造左、右子树的过程是什么呢?就是是栈的操作是怎么样的?
搜索更多相关主题的帖子: 二叉树 递归 
2008-11-27 09:12
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
你可以尝试使用广义表描述字符串来创建,这种方式更直观。
2008-11-27 09:51
ctw888
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-5-22
收藏
得分:0 
请教再解。
2008-11-27 10:11
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
给你各代码吧:
这是根据二叉树的广义表描述字符串创建的,我觉得这种方式创建是最直观的,
所以每每做二叉树的程序时,我都是用这种方式创建的:
//////////////////////////////////////////////////
//CreateBinTree()私有成员函数
//通过广义表描述字符串建立一棵二叉树,通过指针返回
//例如A(B,C(E,F))#
//////////////////////////////////////////////////
template<class T>
void BinaryTree<T>::CreateBinTree(char* BinStr
            ,BinTreeNode<T>*& subTree)
{
    //逐个读取字符串
    int i=0;               //游标
    int k=0;               //处理标志,0表示根结点,1表示左子树,2表示
    char s;                //存放每次取出的字符
    LinkedStack<BinTreeNode<char>*> LS;
                           //创建二叉树过程中用到的结点指针堆栈
    BinTreeNode<char>* p;  //结点指针变量
    BinTreeNode<char>* t;  //存放从堆栈中弹出的内容
    BinTreeNode<char>* top;//用于存放从堆栈中取出的栈顶元素
         
    while(BinStr[i]!='#')
    {
        s=BinStr[i];
        switch(s)
        {
        case '(':
            LS.Push(p);  //把当前p的内容入栈
            k=1;         //进入左子树的处理
            break;
        case ',':
            k=2;         //进入右子树的处理
            break;
        case ')':
            LS.Pop(t);   //弹出堆栈的内容
            break;
        default:
            //如果取出的字母
            {
                //如果处理的是根结点
                if(k==0)
                {
                    //新建一个结点
                    p=new BinTreeNode<char>(s);
                    //把该指针作为树的指针返回
                    subTree=p;
                }
                //如果处理的是右子树
                else if(k==1)
                {
                    //新建一个接点
                    p=new BinTreeNode<char>(s);
                    //取得栈顶结点
                    LS.getTop(top);
                    //把该结点挂入栈顶的左指针域
                    top->leftChild=p;
                }
                //如果处理的是左子树
                else
                {
                    //新建一个接点
                    p=new BinTreeNode<char>(s);
                    //取得栈顶结点
                    LS.getTop(top);
                    //把该结点挂入栈顶的左指针域
                    top->rightChild=p;
                };
                break;
            };
        };
        i++;
    }
};
///////////////////////////////CreateBinTree()结束
我的代码里用到一个链式堆栈,这只是BinaryTree<T>类里的一个成员函数
你可能不好直接运行,不过思想基本上已经涵盖了。
2008-11-27 10:36
ctw888
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-5-22
收藏
得分:0 
这个是非递归吧。递归的思想如何理解
2008-11-27 11:00
ctw888
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-5-22
收藏
得分:0 
假设虚结点输入时以空格字符表示,相应的构造算法为:
     void CreateBinTree (BinTree *T)
      { //构造二叉链表。T是指向根指针的指针,故修改*T就修改了实参(根指针)本身
        char ch;
        if((ch=getchar())=='') *T=NULL; //读人空格,将相应指针置空
        else{ //读人非空格
              *T=(BinTNode *)malloc(sizeof(BinTNode)); //生成结点
              (*T)->data=ch;
              CreateBinTree(&(*T)->lchild); //构造左子树
              CreateBinTree(&(*T)->rchild); //构造右子树
             }
      }
在这个问题中,CreateBinTree(&(*T)->rchild); //构造右子树。什么时候执行。
我理解是从程序开始先构造左子做,一直构造到空,那么怎么转到右子树上?
2008-11-27 12:14
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 第6楼 ctw888 的帖子
看看二叉树的先序访问方法

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-11-27 12:59
ctw888
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-5-22
收藏
得分:0 
先序访问是明白的。但递归不明白。
2008-11-27 15:51
wefgod
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2008-11-27
收藏
得分:0 
*T=NULL
意思是该节点为空指针
可能是某个节点的左孩子或者右孩子为空
构造左、右子树的过程靠的是
CreateBinTree(&(*T)->lchild); //构造左子树
CreateBinTree(&(*T)->rchild); //构造右子树
这两个递归
你好好看看递归
一下字我不知道怎么说····水平不够
而且用到stack的话那个是非递归的建立一颗二叉树

哦刚看见你后面的
在这个问题中,CreateBinTree(&(*T)->rchild); //构造右子树。什么时候执行。
就是某个节点左孩子为空的时候返回上一层的递归,然后就执行建立右孩子节点
你这个用的是先序的访问建立二叉树
2008-11-27 16:00
wefgod
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2008-11-27
收藏
得分:0 
忘记说了
这个递归对输入的顺序是有要求的····
先输入根节点,然后到····不好说了现在
没有图
2008-11-27 16:03
快速回复:关于二叉树建立(递归)不明白啊。
数据加载中...
 
   



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

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