C语言 二叉树的链式存储实例
二叉树的链式存储
实现二叉树的基本操作:建立、遍历、计算深度、结点数、叶子数等。
输入C,先序创建二叉树,#表示空节点;
输入H:计算二叉树的高度;
输入L:计算二叉树的叶子个数;
输入N:计算二叉树节点总个数;
输入1:先序遍历二叉树;
输入2:中序遍历二叉树;
输入3:后续遍历二叉树;
输入F:查找值=x的节点的个数;
输入P:以缩格文本形式输出所有节点。
很简单就不需要多解释了,代码贴上
#include<stdio.h> #include<stdlib.h> #include<iostream> usingnamespacestd; /*二叉树的链式存储表示*/ typedefcharDataType;/*应由用户定义DataType的实际类型*/ typedefstructnode { DataTypedata; node*lchild,*rchild;/*左右孩子指针*/ }BinTNode;/*结点类型*/ typedefBinTNode*BinTree; intsum=0; voidDisplayBinTree(BinTreeT);/*用格文本形式表示二叉树*/ voidCreateBinTree(BinTree*T);/*构造二叉链表*/ voidPreorder(BinTreeT);/*前序遍历二叉树*/ voidInorder(BinTreeT);/*中序遍历二叉树*/ voidPostorder(BinTreeT);/*后序遍历二叉树*/ intnodes(BinTreeT);/*计算总结点数*/ intleafs(BinTreeT);/*计算总叶子数*/ inthight(BinTreeT);/*计算二叉树的高度*/ intfind(BinTreeT,charx);//查找值=x的节点的个数; intmain() { BinTreeT; charflg; while(cin>>flg) switch(flg) { case'C': getchar(); CreateBinTree(&T); cout<<"Createdsuccess!"<<endl; break; case'H': cout<<"Height="<<hight(T)<<"."<<endl; break; case'L': cout<<"Leaf="<<leafs(T)<<"."<<endl; break; case'N': cout<<"Nodes="<<nodes(T)<<"."<<endl; break; case'1': printf("Preorderis:"); Preorder(T); cout<<"."<<endl; break; case'2': printf("Inorderis:"); Inorder(T); cout<<"."<<endl; break; case'3': printf("Postorderis:"); Postorder(T); cout<<"."<<endl; break; case'F': charx; intko; getchar(); cin>>x; ko=find(T,x); cout<<"Thecountof"<<x<<"is"<<ko<<"."<<endl; break; case'P': cout<<"Thetreeis:"<<endl; DisplayBinTree(T); break; default: cout<<"输入有误,请重新输入"<<endl; } } /*构造二叉链表*/ voidCreateBinTree(BinTree*T) { charch; if((ch=getchar())=='#') *T=NULL; else { /*读入非空格*/ *T=(BinTNode*)malloc(sizeof(BinTNode));/*生成结点*/ (*T)->data=ch; CreateBinTree(&(*T)->lchild);/*构造左子树*/ CreateBinTree(&(*T)->rchild);/*构造右子树*/ } } /*用缩格文本形式表示二叉树*/ voidDisplayBinTree(BinTreeT) { BinTreestack[100],p; intlevel[100],top,n,i; if(T) { top=1; stack[top]=T; level[top]=0; while(top>0) { p=stack[top]; n=level[top]; for(i=1;i<=n;i++) cout<<""; printf("%c\n",p->data); top--; if(p->rchild!=NULL) { top++; stack[top]=p->rchild; level[top]=n+2; } if(p->lchild!=NULL) { top++; stack[top]=p->lchild; level[top]=n+2; } } } } /*计算总结点数*/ intnodes(BinTreeT) { if(T) { if((T->lchild==NULL)&&(T->rchild==NULL)) return1; else returnnodes(T->lchild)+nodes(T->rchild)+1; } return0; } /*计算总叶子数*/ intleafs(BinTreeT) { if(T) { if((T->lchild==NULL)&&(T->rchild==NULL)) return1; else returnleafs(T->lchild)+leafs(T->rchild); } return0; } /*计算树的高度*/ inthight(BinTreeT) { if(T) { if((T->lchild==NULL)&&(T->rchild==NULL)) return1; elseif((T->lchild==NULL)&&(T->rchild)) return1+hight(T->rchild); elseif((T->lchild)&&(T->rchild==NULL)) return1+hight(T->lchild); else returnhight(T->lchild)+hight(T->rchild); } return0; } /*前序遍历二叉树*/ voidPreorder(BinTreeT) { if(T) { printf("%c",T->data);/*访问结点*/ Preorder(T->lchild); Preorder(T->rchild); } } /*中序遍历二叉树*/ voidInorder(BinTreeT) { if(T) { Inorder(T->lchild); printf("%C",T->data); Inorder(T->rchild); } } /*后序遍历二叉树*/ voidPostorder(BinTreeT) { if(T) { Postorder(T->lchild); Postorder(T->rchild); printf("%C",T->data); } } intfind(BinTreeT,charx) { if(T) { if((T->data)==x) sum++; find(T->lchild,x); find(T->rchild,x); } returnsum; }
以上就是二叉树链式存储的一个小实例,需学习要的同学请参考,谢谢支持