算法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大於二叉樹層數
}
