算法1:若無左子女則不應該有右子女
#include "stdafx.h" #include<iostream> #include<queue> using namespace std; typedef struct BTreeNode { int data; struct BTreeNode *lchild,*rchild; }BTree; int _tmain(int argc, _TCHAR* argv[]) { return 0; } int JudgeComplete(BTree *bt) { int tag=0; BTree *p=bt; queue<BTree*> q; if(bt==NULL) { return 1; } q.push(bt);//根節點入隊列 while(!q.empty()) { p = q.front();q.pop();// 返回隊首元素並出隊 if(p->lchild&&tag==0) { q.push(p->lchild);//左子女入隊 } else if(p->lchild)return 0;//前面已有結點為空,本結點不空 else tag=1;//首次出現結點為空 if(p->rchild&&tag==0) { q.push(p->rchild);//右子女入隊 } else if(p->rchild)return 0;//前面已有結點為空,本結點不空 else tag=1;//首次出現結點為空 } return 1; }
2.求二叉樹寬度
#include "stdafx.h" #include<iostream> #include<queue> using namespace std; typedef struct BTreeNode { int data; struct BTreeNode *lchild,*rchild; }BTree; int _tmain(int argc, _TCHAR* argv[]) { return 0; } int width(BTree *bt) { BTree *p=bt; if(bt)return 0; BTree *q[100]; int front=0,rear=0;//隊頭指針,隊尾指針 int last=0;//同一層最右結點在隊列中位置 int temp=0,maxw=0;//當前層寬度與最大寬度 q[rear]=bt; while(front<=last) { p=q[front++];temp++;//同層元素加1; if(p->lchild)q[rear++]=p->lchild; if(p->rchild)q[rear++]=p->rchild; if(front>last)//一層結束 { last=rear; if(temp>maxw)maxw=temp;//更新最大寬度 temp=0; } } return maxw; }
3.二叉樹k層葉子結點
// 1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<iostream> #include<queue> using namespace std; typedef struct BTreeNode { int data; struct BTreeNode *lchild,*rchild; }BTree; int _tmain(int argc, _TCHAR* argv[]) { return 0; } int leafKlevel(BTree *bt,int k) { BTree *p=bt; if(bt||k<1)return 0; BTree *q[100]; int front=0,rear=0;//隊頭指針,隊尾指針 int last=0;//同一層最右結點在隊列中位置 int level=1;//層數 int leaf=0; q[rear]=bt; while(front<=rear) { p=q[front++]; if(level==k&&!p->lchild&&!p->rchild)leaf++;//葉結點 if(p->lchild)q[rear++]=p->lchild; if(p->rchild)q[rear++]=p->rchild; if(front==last)//二叉樹同層最右結點已處理,層數增1 { level++;last=rear; } if(level>k)return leaf; } return 0;//k大於二叉樹層數 }