数据结构—判断是否为完全二叉树
2016-05-29 14:27
417 查看
/* 假设二叉树采用二叉链存储结构,设计一个算法判断一颗二叉树是否为完全二叉树。 */ #include <iostream> #include <malloc.h> #define MaxSize 100 typedef char ElemType; using namespace std; typedef struct node { ElemType data; struct node *lchild; struct node *rchild; } BTNode; void CreateBTNode(BTNode *&b,char *str) //创建二叉树 { BTNode *St[MaxSize],*p; int top=-1,k,j=0; char ch; b=NULL; ch=str[j]; while(ch!='\0') { switch(ch) { case '(': top++; St[top]=p; k=1; break; case ')': top--; break; case ',': k=2; break; default: p=(BTNode *)malloc(sizeof(BTNode)); p->data=ch; p->lchild=p->rchild=NULL; if(b==NULL) b=p; else { switch(k) { case 1: St[top]->lchild=p; break; case 2: St[top]->rchild=p; break; } } } j++; ch=str[j]; } } /* 完全二叉树应满足: (1)某节点没有左孩子,则一定没有右孩子; (2)若某节点缺左或右孩子,则其所有后继节点一定无孩子。 */ bool isT(BTNode *b) { BTNode *qu[MaxSize],*p; //定义队列,用于分层判断 int front=-1,rear=-1; bool cm=true; //表示二叉树是否为完全二叉树 bool bj=true; //表示到目前为止所有节点均有左右孩子 if(b!=NULL) { rear++; qu[rear]=b; while(front!=rear) { front=(front+1)%MaxSize; p=qu[front]; if(p->lchild==NULL) //*p没有左孩子 { bj=false; if(p->rchild!=NULL) //没有左孩子的情况下,有右孩子,错误 cm=false; } else //*p有左孩子 { if(bj) //所有节点都有左右孩子 { rear=(rear+1)%MaxSize; qu[rear]=p->lchild; if(p->rchild==NULL) //有左孩子,但没有右孩子 bj=false; else //有左孩子,也有右孩子 { rear=(rear+1)%MaxSize; qu[rear]=p->rchild; } } else //到目前为止已有节点缺少左或右孩子 cm=false; } } return cm; } return true; } int main() { BTNode *b; CreateBTNode(b,"A(B(D,E),C(F,))"); cout<<"A(B(D,E),C(F,))是否为完全二叉树:"; if(isT(b)) cout<<"是"<<endl; else cout<<"否"<<endl; CreateBTNode(b,"A(B(D(,G)),C(E,F))"); cout<<"A(B(D(,G)),C(E,F))是否为完全二叉树:"; if(isT(b)) cout<<"是"<<endl; else cout<<"否"<<endl; cout<<endl; return 0; }
运行结果:
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)