• 判断二叉树是否是完全二叉树,求二叉树宽度


    算法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大于二叉树层数
    }
    
  • 相关阅读:
    #include
    算法导论 Chapter 9.3 Selection in worstcase linear time
    算法导论 Exercises 9.36
    算法导论 Exercises 9.37
    C++实现Ping
    算法导论 Exercises 9.39
    如何计算毫秒级的时间差
    如何产生 [0, 2147483647] 之间的随机数
    算法导论 Exercises 9.38
    KMP算法学习&总结
  • 原文地址:https://www.cnblogs.com/tgkx1054/p/2625850.html
Copyright © 2020-2023  润新知