判斷二叉樹是否是完全二叉樹,求二叉樹寬度


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM