
求数据结构做二叉树实验的心得体会、、、
#include#include#includeStatus.c#includeSqStack.c#include二叉树.cvoid main( ){BiTree T;int c,h,l; printf(构造二叉树\\\ );CreateBiTree(T);printf(统计二叉树的叶结点数\\\ ); countleaf(T,&c);printf(计算二叉树的深度\\\ ); treedepth(T,l,&h);printf(%d\\\ %d\\\ ,&c,&h);}以下这一段建文件为SqStack.c\\\/\\\/-----------二叉树的二叉链表存储表示---------typedef struct BiTNode{ DataType data; struct BiTNode *lchild, *rchild;} BiTNode,*BiTree;\\\/\\\/左右孩子指针int PreOderTraverse( BiTree T,int(*visit)(DataType) ) { \\\/\\\/先序遍历的递归算法 if(T) { if(visit(T->data)) if(PreOderTraverse (T->lchild,visit)) if(PreOderTraverse (T->rchild,visit)) return OK; return ERROR; } else return OK;} \\\/\\\/PreOderTraversevoid preTraverse(BiTree T ){ \\\/\\\/先序遍历的非递归算法 BiTree p; Stack S; if(T){ p=T; S=InitStack();\\\/\\\/构造一个空栈Push(&S,p);\\\/\\\/根指针进栈 while(!StackEmpty(&S)) { while(GetTop(&S,&p)&& p){ p=p->data;\\\/\\\/访问*p Push(&S,p->lchild);\\\/\\\/向左到头 } Pop(&S,&p);\\\/\\\/空指针退栈 if(!StackEmpty(&S)){ \\\/\\\/访问结点,向右一步 Pop(&S,&p); p=p->rchild; Push(&S,p); \\\/\\\/向右走 } \\\/\\\/ if } \\\/\\\/while } \\\/\\\/ if} \\\/\\\/InOrderTraverseStatus CreateBiTree(BiTree T){ \\\/\\\/先序输入二叉树中元素值,构造二叉链表 char ch; ch=getchar( ); if(ch==' ') T=NULL; else { T=(BiTree )malloc(sizeof(BiTNode)); if(!T) exit(OVERFLOW); T->data=ch; \\\/\\\/生成根结点 CreateBiTree(T->lchild); \\\/\\\/构造左子树 CreateBiTree(T->rchild); } \\\/\\\/构造右子树 return OK;} \\\/\\\/CreateBiTreevoid countleaf(BiTree T, int c) { \\\/\\\/统计二叉树T的叶结点数,结果存于c中 if(T){ if((!T->lchild)&&(!T->rchild)) { c++; \\\/\\\/ 若T所指结点无左、右子结点则计数 return; } countleaf(T->lchild,c);\\\/\\\/统计左子树的叶结点数 countleaf(T->rchild,c);\\\/\\\/统计左子树的叶结点数 } \\\/\\\/if} \\\/\\\/countleafvoid treedepth(BiTree T,int l,int h){ \\\/\\\/ 求二叉树T的深度,结果存放在h中,l是当前层数 int l1=0,l2=0,h1=0,h2=0; if(T){ l++; if (l>h) h=l; treedepth(T->lchild,l1, h1);\\\/\\\/求左子树的深度 treedepth(T->rchild,l2, h2);\\\/\\\/求右子树的深度 if (h1>h2) h=h+h1; else h=h+h2; } \\\/\\\/if} \\\/\\\/ treedepth以下这一段,建文件为 二叉树.c\\\/\\\/===========ADT Stack的表示与实现=========== \\\/\\\/-------------栈的顺序存储表示----------#define M 100typedef struct {DataType data[M]; \\\/\\\/存放栈元素的数组int top; \\\/\\\/ 栈顶指针,初始时设为0} Stack,*SqStack; \\\/\\\/--------基本操作的函数原型说明----------Stack InitStack(){ \\\/\\\/构造一个空栈SStack S; S.top=0; return S;}\\\/\\\/InitStackStatus ClearStack(SqStack S){ \\\/\\\/将栈S清空,把S置为空栈S->top=0; return OK;}Status StackEmpty(SqStack S){ \\\/\\\/若栈S为空栈,则返回TRUE,否则返回FALSE if(S->top==0) return TRUE; else return FALSE;}Status GetTop(SqStack S, DataType *e) { \\\/\\\/若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR if( S->top==0) return ERROR; *e=S->data[S->top-1]; return OK;}Status StackFull(SqStack S){ \\\/\\\/ 判断栈满,若栈满返回1if (S->top==M) return TRUE;else return FALSE;}Status Push(SqStack S,DataType e){ \\\/\\\/若栈满返回0,否则在栈顶插入元素e if (StackFull(S)) \\\/\\\/栈满不能进栈 return OVERFLOW; S->data[S->top] = e; \\\/\\\/在栈顶插入x S->top++; \\\/\\\/栈顶指针加1 return OK;}\\\/\\\/PushStatus Pop(SqStack S, DataType *e){ \\\/\\\/若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR if(StackEmpty(S))return ERROR;S->top--; \\\/\\\/栈顶指针减1*e=S->data[S->top];\\\/\\\/取栈顶元素存入e,return OK;}\\\/\\\/Pop
树和二叉树实验总结
树的话是计算机语言,其中二叉树是树的一个特例,是树每个节点分出2个小节满树的树为二叉树。
已知二叉树度为1的结点,怎么求二叉树的总结点数?
度为1的结点个数不决定二叉树的结点总数,因此只是知道二叉树为1的结点数不能推出整个二叉树结点总数。
例如度为1的结点数为0 ,此时二叉树可以是任意层次的满二叉树
在深度为7的完全二叉树中,总结点数为111,则度为1的结点个数为
深度为7的完全二叉树的结点数在64~127之间设二叉树中度为0,1,2的结点个数分别为n0,n1,n2,根据二叉树的性质:n0 = n2 + 1二叉树中总结点个数为n0 + n1 + n2 = 2n2 +1 + n1现在按条件2n2 + 1 + n1 = 111显然n1 为偶数,由于是完全二叉树,n1 只能是0或者1因此n1 = 0即度为1的结点个数为0
试编程求二叉树T的总结点数
二叉树就是说一个结点下面可能有两个子结点(度为2),也可能有一个子结点(度为1),或者没有子结点(度为0,也叫叶子结点)那么在这棵树中只可能出现三种情况:度为2,度为1,度为0(叶子结点)。
不可能出现其他情况,否则就不是二叉树了。
所以,总结点数应该为三者之和。
已经知道:度为0=70,度为1=80度为2=度为0-1=69(这是公式,原因说起来太麻烦,你自己 画个图可能会更清楚。
)所以:总结点数=度为2+度为1+度为0=69+80+70=219