用C语言读取前序建立二叉树

来源:互联网 发布:淘宝客怎么采集 编辑:程序博客网 时间:2024/06/05 03:32

     今天做编译原理的由正则表达式生成最小DFA需要用到二叉树结构。于是回顾了一下二叉树的建立。

     今天很惨,我记得以前对于二叉树的建立很熟很熟,并且我还赞叹过利用前序建立树的巧妙。可是今天当我想前序建立树时,却死活建不出来!我只记得了这几步:

                if(ch=='#') 

                  {

                      p=NULL;

                      return ;

                   }

                 p->value=ch;

                creatTree(p->lnode);

                creatTree(p->rnode);

              先介绍一下前序建立二叉树的思想。如图1所示的二叉树

      

  其中除‘#’以外的节点是真实的二叉树,也就是需要我们构造的二叉树。现在将每个叶子节点的空子节点用‘#’节点填充,我们姑且称之为#扩展二叉树。然后写出#扩展二叉树的前序遍历:ab#d##c##,这便是我们程序的输入。程序思想是,遇到‘#’便将p赋NULL,如果不是‘#’,就malloc(sizeof(Treenode)),将值赋予Treenode,然后creatTree(p->lnode);creatTree(rnode);

      以下为生成树代码段(注:有误!!)

     


    这段代码在算法上没有什么问题,但是却始终遍历不到二叉树!我在调试后,发现是root始终为NULL。我一开始以为是算法问题,但是我模拟了一遍程序运行,发现算法很完善。我在这想了半天。我想到了C语言中函数参数的实参、形参与引用,但是我认为我这是在操作指针,不必加引用。但是结果证明,肯定需要加引用。因为指针变量说到底也是变量,我在函数中操作变量的形参,必然不会引起原参数值的变化。而如果我在函数操作中传入的是这个变量的指针地址,然后对这个指针指向的地址进行操作,便可更改变量的值。下面的代码是正确的:
    

        我在函数形参前加了取址符号&,表示我引用了实参。

        也就是说,我传入的是指向这个变量存储位置的指针,函数可以通过这个指针修改实参的值,所以我对加了引用的形参修改便修改了实参的值。

       重点在于,指针变量也是变量,如果要在函数中想要使对于形参的值修改对应到实参的值修改,必须加引用&。

       关于利用中序、后序建立二叉树的方法,改日再探索。

     

0 0
原创粉丝点击