编程论坛's Archiver

yinlili 发表于 2006-11-29 23:12

[求助]  关于二叉树的编程

<P>题目是 定义一个抽象的数据类型 用C++编程  二叉树的建立 遍历 叶子节点个数 节点总数 高度 清除二叉树.我需要有头文件主函数... 就是直接可以运行起来的!<BR>这是我写的程序 老师说错的 在定义a的时候定义成字符窜 才对  可是我不会啊 还有别的错误 好象是和C混淆了[em08] 帮我改改拉.......<BR>#include&lt;iostream.h&gt; </P>
<P>  #include&lt;math.h&gt;        <BR> typedef  struct  BT{             <BR>     char   date;                <BR>     BT *lchild,*rchild;             <BR> } BT ,*tree ;                  <BR> void   create(tree  &amp;n)   {                <BR>     char   a;                                                <BR>     cin&gt;&gt;a;                  <BR>     if(<a href="mailto:a=='@')n=NULL" target="_blank" >a=='@')n=NULL</A>;           <BR>     else   {                  <BR>         n=new BT;                  <BR>         n-&gt;date=a;                    <BR>         create(n-&gt;lchild);                   <BR>         create(n-&gt;rchild); }                     <BR> }                  <BR> void   read1(tree  &amp;n){//先序              <BR>     if(n)              <BR>     {                  <BR>         <BR>         cout&lt;&lt;n-&gt;date&lt;&lt;"   ";                  <BR>         read1(n-&gt;lchild);                   <BR>         read1(n-&gt;rchild);                   <BR>     }       <BR> }             <BR>    void read2(tree &amp;n){//中序                  <BR>        if(n)     {     <BR>            read2(n-&gt;lchild);         <BR>            cout&lt;&lt;n-&gt;date&lt;&lt;"  ";         <BR>            read2(n-&gt;rchild); <BR>        } <BR>    } <BR>    void read3(tree &amp;n){//后序               <BR>        if(n)         {         <BR>            read3(n-&gt;lchild);         <BR>            read3(n-&gt;rchild);             <BR>            cout&lt;&lt;n-&gt;date&lt;&lt;"  ";     <BR>    } <BR>    }  <BR>    int countleafs(tree &amp;n)  {      <BR>        if(n-&gt;date==0)         <BR>            return 0;         <BR>        else             if(n-&gt;lchild&amp;&amp;n-&gt;rchild==0)             <BR>            return 1;     <BR>        return countleafs(n-&gt;lchild)+countleafs(n-&gt;rchild); <BR>    } <BR>    int count(tree &amp;n)<BR>    {<BR>        if(n-&gt;date==0) return 0;<BR>        else return 1+count(n-&gt;lchild)+count(n-&gt;rchild);<BR>    }<BR>    int Height(tree &amp;n)<BR>    {<BR>        if(n-&gt;date==0) return 0;<BR>        else{<BR>            int a=Height(n-&gt;lchild);<BR>            int b=Height(n-&gt;rchild);<BR>            return(a&gt;b)? a+1:b+1;<BR>        }<BR>    }<BR>    int Destroy(tree &amp;n);<BR>    {<BR>        if(n-&gt;date==0)return TRUE<BR>        else return n=NULL<BR>    }<BR>    main()      {            <BR>        tree  n;            <BR>        create(n);            <BR>        read1(n);         <BR>        cout&lt;&lt;endl;     <BR>        read2(n);         <BR>        cout&lt;&lt;endl;     <BR>        read3(n);         <BR>        cout&lt;&lt;endl;         <BR>        countleafs(n);<BR>        count(n);<BR>        Height(n);<BR>        Destroy(n);<BR>        cout&lt;&lt;endl;                   <BR>        return   0;               <BR>    }<BR></P>

mzx87 发表于 2006-11-30 13:03

<P>#include "stdafx.h"<BR>#include "iostream.h"<BR>#include "stdlib.h"<BR>#include "math.h"<BR>#define NULL 0<BR>#define ERROR 0<BR>#define TRUE 1<BR>#define FALSE 0<BR>#define OK 1</P>
<P>typedef int Status;<BR>typedef char TElemType;<BR>typedef struct BiTNode{<BR>    TElemType  data;<BR>    struct BiTNode *lchild,*rchild; <BR>}BiTNode,*BiTree;</P>
<P>Status CreateBiTree(BiTree &amp;T){                //建立二叉链表<BR>    char ch;<BR>    ch=getchar();<BR>    if(ch==' ')<BR>        T=NULL;<BR>    else {<BR>        if(!(T=(BiTree)malloc(sizeof(BiTNode))))<BR>            exit(OVERFLOW);<BR>        T-&gt;data=ch;                            //将输入的数值赋给根结点<BR>        CreateBiTree(T-&gt;lchild);            //构造左子树<BR>        CreateBiTree(T-&gt;rchild);            //构造右子树<BR>    }<BR>    return OK;<BR>}<BR>Status ExchangeBitree(BiTree &amp;T){            //交换二叉树的左右子树<BR>    BiTree t;<BR>    if(T==NULL)<BR>        return OK;<BR>    else {<BR>    t=T-&gt;lchild;<BR>    T-&gt;lchild=T-&gt;rchild;<BR>    T-&gt;rchild=t;<BR>    ExchangeBitree(T-&gt;lchild);<BR>    ExchangeBitree(T-&gt;rchild);<BR>    return OK;<BR>    }<BR>}<BR>Status PreOrderTraverse(BiTree &amp;T){            //先序遍历二叉树<BR>    if(T==NULL)                                //二叉树空,返回<BR>        return OK;<BR>    else {<BR>        cout&lt;&lt;T-&gt;data&lt;&lt;' ';                    //输出根结点<BR>        PreOrderTraverse(T-&gt;lchild);        //递归遍历访问左子树<BR>        PreOrderTraverse(T-&gt;rchild);        //递归遍历访问右子树<BR>        return OK;<BR>    }<BR>}<BR>Status InOrderTraverse(BiTree &amp;T){            //中序遍历二叉树<BR>    if(T==NULL)                                //二叉树空,返回<BR>        return OK;<BR>    else {<BR>        InOrderTraverse(T-&gt;lchild);            //递归遍历访问左子树<BR>        cout&lt;&lt;T-&gt;data&lt;&lt;' ';                    //输出根结点<BR>        InOrderTraverse(T-&gt;rchild);            //递归遍历访问右子树<BR>        return OK;<BR>    }<BR>}<BR>Status PostOrderTraverse(BiTree &amp;T){        //后序遍历二叉树<BR>    if(T==NULL)                                //二叉树空,返回<BR>        return OK;<BR>    else {<BR>        PostOrderTraverse(T-&gt;lchild);        //递归遍历访问左子树<BR>        PostOrderTraverse(T-&gt;rchild);        //递归遍历访问右子树<BR>        cout&lt;&lt;T-&gt;data&lt;&lt;' ';                    //输出根结点<BR>        return OK;<BR>    }<BR>}<BR>Status NodeCount(BiTree T){                    //统计二叉树的结点个数<BR>    if(T==NULL)                                //如果是空树,返回0<BR>        return 0;<BR>    else                                    //否则访问左右子树,并求得结点总数,最后加1,即根结点<BR>        return 1+NodeCount(T-&gt;lchild)+NodeCount(T-&gt;rchild);<BR>}<BR>Status LeafNodeCount(BiTree &amp;T){            //统计叶结点个数<BR>    if(T==NULL)                                //如果二叉树为空,返回0<BR>        return 0;<BR>    else if((T-&gt;lchild==NULL)&amp;&amp;(T-&gt;rchild==NULL))    //如果为叶子结点,返回1    <BR>        return 1;<BR>    else <BR>        return LeafNodeCount(T-&gt;lchild)+LeafNodeCount(T-&gt;rchild);//叶子结点树为左子树与右子树叶子数之和<BR>}<BR>Status DepthBiTree(BiTree &amp;T){                //计算二叉树的深度<BR>    int m,n;<BR>    if(T==NULL)                                //如果二叉树为空,则深度为0<BR>        return 0;<BR>    else {<BR>        m=DepthBiTree(T-&gt;lchild)+1;<BR>        n=DepthBiTree(T-&gt;rchild)+1;<BR>    }<BR>    return (m&gt;n?m:n);<BR>}<BR>Status DblOrderTraverse(BiTree &amp;T){            //双序遍历二叉树<BR>    if(T==NULL)<BR>        return OK;<BR>    else {<BR>        cout&lt;&lt;T-&gt;data;<BR>        DblOrderTraverse(T-&gt;lchild);<BR>        cout&lt;&lt;T-&gt;data;<BR>        DblOrderTraverse(T-&gt;rchild);<BR>        return OK;<BR>    }<BR>}<BR>int main(int argc, char* argv[])<BR>{<BR>    BiTree T;<BR>    int a;<BR>    char c;<BR>    cout&lt;&lt;"\t^_^您好!\n\t请按照先序顺序输入一棵字母二叉树"&lt;&lt;endl;<BR>    CreateBiTree(T);<BR>    cout&lt;&lt;"请选择操作:";<BR>    cout&lt;&lt;"\t1.返回先序遍历结果"&lt;&lt;endl;<BR>    cout&lt;&lt;"\t\t2.返回中序遍历结果"&lt;&lt;endl;<BR>    cout&lt;&lt;"\t\t3.返回后序遍历结果"&lt;&lt;endl;<BR>    cout&lt;&lt;"\t\t4.求取二叉树结点总数"&lt;&lt;endl;<BR>    cout&lt;&lt;"\t\t5.求取二叉树叶子结点总数"&lt;&lt;endl;<BR>    cout&lt;&lt;"\t\t6.求取二叉S树深度"&lt;&lt;endl;<BR>    cout&lt;&lt;"\t\t7.交换二叉树的左右子树"&lt;&lt;endl;<BR>    cout&lt;&lt;"\t\t8.双序访问二叉树的左右子树"&lt;&lt;endl;<BR>    do{<BR>        cout&lt;&lt;"操作";<BR>        cin&gt;&gt;a;<BR>        switch(a){<BR>        case 1: cout&lt;&lt;"先序遍历的结果为:\t";<BR>                PreOrderTraverse(T);<BR>                break;<BR>        case 2: cout&lt;&lt;"中序遍历的结果为:\t";<BR>                InOrderTraverse(T);<BR>                break;<BR>        case 3: cout&lt;&lt;"后序遍历的结果为:\t";<BR>                PostOrderTraverse(T);<BR>                break;<BR>        case 4: cout&lt;&lt;"二叉树的结点总数为:   ";<BR>                cout&lt;&lt;NodeCount(T);<BR>                break;<BR>        case 5: cout&lt;&lt;"二叉树的叶子结点总数为:   ";<BR>                cout&lt;&lt;LeafNodeCount(T);<BR>                break;<BR>        case 6: cout&lt;&lt;"二叉树的深度为:   ";<BR>                cout&lt;&lt;DepthBiTree(T);<BR>                break;<BR>        case 7: ExchangeBitree(T);                <BR>                cout&lt;&lt;"交换后前序遍历:\t";<BR>                PreOrderTraverse(T);<BR>                cout&lt;&lt;endl&lt;&lt;"交换后中序遍历:\t";<BR>                InOrderTraverse(T);<BR>                cout&lt;&lt;endl&lt;&lt;"交换后后序遍历:\t";<BR>                PostOrderTraverse(T);</P>

hufen 发表于 2007-3-26 18:14

上面的回答中提到的#include "stdafx.h"在我的编译器里面没有,所以程序不能运行,他是不是把c和c++混淆在一起用,如果要在握的编译器中也能运行的话要怎么改呢?<BR>

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.