[求助] 关于二叉树的编程
<P>题目是 定义一个抽象的数据类型 用C++编程 二叉树的建立 遍历 叶子节点个数 节点总数 高度 清除二叉树.我需要有头文件主函数... 就是直接可以运行起来的!<BR>这是我写的程序 老师说错的 在定义a的时候定义成字符窜 才对 可是我不会啊 还有别的错误 好象是和C混淆了[em08] 帮我改改拉.......<BR>#include<iostream.h> </P><P> #include<math.h> <BR> typedef struct BT{ <BR> char date; <BR> BT *lchild,*rchild; <BR> } BT ,*tree ; <BR> void create(tree &n) { <BR> char a; <BR> cin>>a; <BR> if(<a href="mailto:a=='@')n=NULL" target="_blank" >a=='@')n=NULL</A>; <BR> else { <BR> n=new BT; <BR> n->date=a; <BR> create(n->lchild); <BR> create(n->rchild); } <BR> } <BR> void read1(tree &n){//先序 <BR> if(n) <BR> { <BR> <BR> cout<<n->date<<" "; <BR> read1(n->lchild); <BR> read1(n->rchild); <BR> } <BR> } <BR> void read2(tree &n){//中序 <BR> if(n) { <BR> read2(n->lchild); <BR> cout<<n->date<<" "; <BR> read2(n->rchild); <BR> } <BR> } <BR> void read3(tree &n){//后序 <BR> if(n) { <BR> read3(n->lchild); <BR> read3(n->rchild); <BR> cout<<n->date<<" "; <BR> } <BR> } <BR> int countleafs(tree &n) { <BR> if(n->date==0) <BR> return 0; <BR> else if(n->lchild&&n->rchild==0) <BR> return 1; <BR> return countleafs(n->lchild)+countleafs(n->rchild); <BR> } <BR> int count(tree &n)<BR> {<BR> if(n->date==0) return 0;<BR> else return 1+count(n->lchild)+count(n->rchild);<BR> }<BR> int Height(tree &n)<BR> {<BR> if(n->date==0) return 0;<BR> else{<BR> int a=Height(n->lchild);<BR> int b=Height(n->rchild);<BR> return(a>b)? a+1:b+1;<BR> }<BR> }<BR> int Destroy(tree &n);<BR> {<BR> if(n->date==0)return TRUE<BR> else return n=NULL<BR> }<BR> main() { <BR> tree n; <BR> create(n); <BR> read1(n); <BR> cout<<endl; <BR> read2(n); <BR> cout<<endl; <BR> read3(n); <BR> cout<<endl; <BR> countleafs(n);<BR> count(n);<BR> Height(n);<BR> Destroy(n);<BR> cout<<endl; <BR> return 0; <BR> }<BR></P> <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 &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->data=ch; //将输入的数值赋给根结点<BR> CreateBiTree(T->lchild); //构造左子树<BR> CreateBiTree(T->rchild); //构造右子树<BR> }<BR> return OK;<BR>}<BR>Status ExchangeBitree(BiTree &T){ //交换二叉树的左右子树<BR> BiTree t;<BR> if(T==NULL)<BR> return OK;<BR> else {<BR> t=T->lchild;<BR> T->lchild=T->rchild;<BR> T->rchild=t;<BR> ExchangeBitree(T->lchild);<BR> ExchangeBitree(T->rchild);<BR> return OK;<BR> }<BR>}<BR>Status PreOrderTraverse(BiTree &T){ //先序遍历二叉树<BR> if(T==NULL) //二叉树空,返回<BR> return OK;<BR> else {<BR> cout<<T->data<<' '; //输出根结点<BR> PreOrderTraverse(T->lchild); //递归遍历访问左子树<BR> PreOrderTraverse(T->rchild); //递归遍历访问右子树<BR> return OK;<BR> }<BR>}<BR>Status InOrderTraverse(BiTree &T){ //中序遍历二叉树<BR> if(T==NULL) //二叉树空,返回<BR> return OK;<BR> else {<BR> InOrderTraverse(T->lchild); //递归遍历访问左子树<BR> cout<<T->data<<' '; //输出根结点<BR> InOrderTraverse(T->rchild); //递归遍历访问右子树<BR> return OK;<BR> }<BR>}<BR>Status PostOrderTraverse(BiTree &T){ //后序遍历二叉树<BR> if(T==NULL) //二叉树空,返回<BR> return OK;<BR> else {<BR> PostOrderTraverse(T->lchild); //递归遍历访问左子树<BR> PostOrderTraverse(T->rchild); //递归遍历访问右子树<BR> cout<<T->data<<' '; //输出根结点<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->lchild)+NodeCount(T->rchild);<BR>}<BR>Status LeafNodeCount(BiTree &T){ //统计叶结点个数<BR> if(T==NULL) //如果二叉树为空,返回0<BR> return 0;<BR> else if((T->lchild==NULL)&&(T->rchild==NULL)) //如果为叶子结点,返回1 <BR> return 1;<BR> else <BR> return LeafNodeCount(T->lchild)+LeafNodeCount(T->rchild);//叶子结点树为左子树与右子树叶子数之和<BR>}<BR>Status DepthBiTree(BiTree &T){ //计算二叉树的深度<BR> int m,n;<BR> if(T==NULL) //如果二叉树为空,则深度为0<BR> return 0;<BR> else {<BR> m=DepthBiTree(T->lchild)+1;<BR> n=DepthBiTree(T->rchild)+1;<BR> }<BR> return (m>n?m:n);<BR>}<BR>Status DblOrderTraverse(BiTree &T){ //双序遍历二叉树<BR> if(T==NULL)<BR> return OK;<BR> else {<BR> cout<<T->data;<BR> DblOrderTraverse(T->lchild);<BR> cout<<T->data;<BR> DblOrderTraverse(T->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<<"\t^_^您好!\n\t请按照先序顺序输入一棵字母二叉树"<<endl;<BR> CreateBiTree(T);<BR> cout<<"请选择操作:";<BR> cout<<"\t1.返回先序遍历结果"<<endl;<BR> cout<<"\t\t2.返回中序遍历结果"<<endl;<BR> cout<<"\t\t3.返回后序遍历结果"<<endl;<BR> cout<<"\t\t4.求取二叉树结点总数"<<endl;<BR> cout<<"\t\t5.求取二叉树叶子结点总数"<<endl;<BR> cout<<"\t\t6.求取二叉S树深度"<<endl;<BR> cout<<"\t\t7.交换二叉树的左右子树"<<endl;<BR> cout<<"\t\t8.双序访问二叉树的左右子树"<<endl;<BR> do{<BR> cout<<"操作";<BR> cin>>a;<BR> switch(a){<BR> case 1: cout<<"先序遍历的结果为:\t";<BR> PreOrderTraverse(T);<BR> break;<BR> case 2: cout<<"中序遍历的结果为:\t";<BR> InOrderTraverse(T);<BR> break;<BR> case 3: cout<<"后序遍历的结果为:\t";<BR> PostOrderTraverse(T);<BR> break;<BR> case 4: cout<<"二叉树的结点总数为: ";<BR> cout<<NodeCount(T);<BR> break;<BR> case 5: cout<<"二叉树的叶子结点总数为: ";<BR> cout<<LeafNodeCount(T);<BR> break;<BR> case 6: cout<<"二叉树的深度为: ";<BR> cout<<DepthBiTree(T);<BR> break;<BR> case 7: ExchangeBitree(T); <BR> cout<<"交换后前序遍历:\t";<BR> PreOrderTraverse(T);<BR> cout<<endl<<"交换后中序遍历:\t";<BR> InOrderTraverse(T);<BR> cout<<endl<<"交换后后序遍历:\t";<BR> PostOrderTraverse(T);</P> 上面的回答中提到的#include "stdafx.h"在我的编译器里面没有,所以程序不能运行,他是不是把c和c++混淆在一起用,如果要在握的编译器中也能运行的话要怎么改呢?<BR>
页:
[1]
