二叉树的顺序存储结构
来源:互联网 发布:卸载mac上的软件 编辑:程序博客网 时间:2024/05/24 00:57
二叉树的顺序存储结构#include<iostream>#include<cstdio>using namespace std;#define Virnode '0'//定义虚拟节点#define MAX_TREE_SIZE 100//定义存储空间最大量typedef char Elemtype;//定义节点类型typedef Elemtype SqBitTree[MAX_TREE_SIZE];//SqbitTree[0]单元存放节点的总数,通常存放构成满二叉树的节点总数void leveltree(SqBitTree bt)//按满二叉树遍历{ int i=1; while(i<=bt[0]) { for(int j=i;j<2*i;j++){//按层扫描 if(bt[j]==Virnode) cout<<"*"; else cout<<bt[j]; } cout<<endl; i*=2;//跳到下一层的节点 }}void crebitree (SqBitTree bt,int n)//n为真实节点{ int m=0; int i=1; while(m<n) { for(int j=i;j<2*i;j++){//按层次输入,虚拟节点值一起输入 scanf("%c",bt+j); if(bt[j]!=Virnode) m++; } i*=2; } bt[0]=i-1;//存放满二叉树的节点总数}void exchange(SqBitTree bt){ int k=2; while(k<=bt[0]) { for(int i=k,j=2*k-1;i<j;i++,j--) {Elemtype t=bt[i];bt[i]=bt[j];bt[j]=t;} k*=2; }}int coutleaf(SqBitTree bt){ int i=1; int cnt=0; while(i<=bt[0]/2)//按性质可知,凡是大于bt[0]/2的节点均为叶子节点 { for(int j=i;j<2*i;j++) if(bt[j]!=Virnode&&bt[2*j]==Virnode&&bt[2*j+1]==Virnode) cnt++; i*=2; } for(int j=i;j<2*i;j++)//最底层不是虚拟节点,就是叶子节点 if(bt[j]!=Virnode) cnt++; return cnt;}int high(SqBitTree bt){ int h=0; int i=1; while(i<=bt[0]) { h++; i*=2; } return h;}int count2(SqBitTree bt){ int i=1; int cnt=0; while(i<=bt[0]/2)//由性质可知,大于bt[0]/2的节点不可能是度为2的节点 { for(int j=i;j<i*2;j++) if(bt[j]!=Virnode&&bt[j*2]!=Virnode&&bt[j*2+1]!=Virnode) cnt++; i*=2; } return cnt;}int count1(SqBitTree bt){ int i=1; int cnt=0; while(i<=bt[0]/2)//由性质可知,大于bt[0]/2的节点不可能是度为1的节点 { for(int j=i;j<2*i;j++) if(bt[j]!=Virnode&&((bt[j*2]==Virnode&&bt[j*2+1]!=Virnode)||(bt[j*2+1]==Virnode&&bt[j*2]!=Virnode))) cnt++; i*=2; } return cnt;}void search(SqBitTree bt,Elemtype x,Elemtype *pa,Elemtype *lc,Elemtype *rc){ int i=1; while(i<=bt[0]&&bt[i]!=x) i++; if(i>bt[0]){cout<<"Not found"<<endl;*pa=*lc=*rc=Virnode;return ;} if(i==1) {cout<<"This node has not parents"<<endl;*pa=Virnode;} else *pa=bt[i/2]; if(i>bt[0]/2||bt[i*2]==Virnode) {cout<<"This node has not left child"<<endl;*lc=Virnode;} else *lc=bt[i*2]; if(i>bt[0]/2||bt[i*2+1]==Virnode) {cout<<"This node has not right child"<<endl; *rc=Virnode;} else *rc=bt[i*2+1];}int main(){ SqBitTree bt; int n; int leaf; int h; Elemtype x,*pa,*lc,*rc; pa=(Elemtype *)malloc(sizeof(Elemtype)); lc=(Elemtype *)malloc(sizeof(Elemtype)); rc=(Elemtype *)malloc(sizeof(Elemtype)); cin>>n; getchar(); memset(bt,0,sizeof(bt)); crebitree(bt,n); leveltree(bt); exchange(bt); leveltree(bt); leaf=coutleaf(bt); cout<<leaf<<endl; h=high(bt); cout<<h<<endl; cout<<count2(bt)<<endl; cout<<count1(bt)<<endl; cin>>x; search(bt,x,pa,lc,rc); cout<<*pa<<" "<<*lc<<" "<<*rc<<endl; return 0;}
0 0
- 二叉树的顺序存储结构
- 基于顺序存储的二叉树结构
- 二叉树的顺序存储结构
- 二叉树的顺序存储结构
- 二叉树的顺序存储结构
- 二叉树的顺序存储结构
- 【数据结构】二叉树的顺序存储结构--遍历二叉树
- 二叉树的顺序存储结构的C++实现
- (数据结构第六章)二叉树的顺序存储结构
- 二叉树的顺序存储
- 二叉树的顺序存储
- 二叉树的顺序存储
- 二叉树的顺序存储
- 二叉树的顺序存储
- 二叉树的顺序存储
- 二叉树的顺序存储
- 二叉树的顺序存储
- 第十一周项目1-二叉树构造算法的验证--由顺序存储结构转为二叉链存储结构
- 【HUSTOJ】1004: 求商与余数
- 链表结点的插入
- 堆栈
- 深入理解Java内存模型——重排序
- MyEclipse中输入变量名自动出现String
- 二叉树的顺序存储结构
- Java核心知识点-NIO
- 算法复习之二叉树的遍历
- ArchLinux 升级导致的wifi故障
- 手拖XMPP遇到问题解决地址
- 【自考】又到自考总结季
- c++第四次上机实验—作业
- jquery的$.extend和$.fn.extend作用及区别
- hibernate 创建数据中一张表的方法