C语言实现判断二叉树是否是完全二叉树

小菜鸟成长记 2011-07-23 10:39:47
希望高人指点这个算法哪里不对
//判断二叉树是否是完全二叉树
#include<stdio.h>
#include<windows.h>
typedef struct Bitnode
{
public:
char data;
Bitnode *lchild,*rchild;
};
int i = 1;
Bitnode *head;
Bitnode* create(Bitnode *T)
{
char ch;
scanf("%c",&ch);
if(ch=='x')
T=NULL;
else
{
T=new Bitnode;
if(i == 1)
head = T;
i++;
if(!T)
{

printf("error!");
exit(1);
}
T->data =ch;
T->lchild =new Bitnode;
T->lchild=create(T->lchild );
T->rchild =new Bitnode;
T->rchild=create(T->rchild );
}
return T;
}
typedef struct
{
Bitnode data[10];
int front;
int rear;
}Queue;
void inital(Queue *q)
{
q->front =0;
q->rear =0;
}
void push(Queue *q,Bitnode t)
{
q->data [q->rear]=t;
q->rear++;
}
int isempty(Queue *q)
{
if(q->front ==q->rear )
return 1;
else
return 0;
}
Bitnode pop(Queue *q)
{
return q->data [q->front];
q->front++;
}
int Iserchashu(Bitnode *t,Queue *q)
{
Bitnode *p;
int flag=0;
push(q,*t);
while(!isempty(q))
{
*p=pop(q);
if(!p)
flag=1;
else
if(flag==1)
return 0;
push(q,*p->lchild );
push(q,*p->rchild );
}
}
void main()
{
Bitnode *t;
create(t);
Queue *q;
inital(q);
printf("%d",Iserchashu(head,q));
}
...全文
519 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
至善者善之敌 2011-07-23
  • 打赏
  • 举报
回复
/*先要对二叉树进行层次遍历,在遍历过程中对每一个结点进行检查:
(1)如果当前结点没有右子树,则剩下的全部结点必须既没有左子树,又没有右子树;
(2)如果当前结点有右子树,则它必须也有左子树.

如果同时满足(1)(2),则是完全二叉树;否则不是.

对二叉树进行层次遍历需要使用队列结构.
*/

#include <stdio.h>
#include <malloc.h>

#define TRUE 1
#define FALSE 0
typedef int BOOL;

typedef char DATATYPE;
typedef struct _node
{
DATATYPE Data;
struct _node *pLeft;
struct _node *pRight;
} NODE;

/*队列*/
typedef struct
{
BOOL bIsEmpty;
int nFront;
int nRear;
int nSize;
NODE **pData;
} QUEUE;

/*队列初始化。nSize = 数组大小*/
void InitQueue(QUEUE *pQue, int nSize)
{
pQue-> pData = (NODE **)malloc(sizeof(NODE *) * nSize);
pQue-> nSize = nSize;
pQue-> nFront = pQue-> nRear = 0;
pQue-> bIsEmpty = TRUE;
}

/*入队列*/
BOOL InQueue(QUEUE *pQue, NODE *Data)
{
if (pQue-> bIsEmpty || pQue-> nRear != pQue-> nFront) /*判断队列是否满*/
{
pQue-> bIsEmpty = FALSE;
pQue-> pData[pQue-> nRear] = Data;
pQue-> nRear++;
if (pQue-> nRear == pQue-> nSize)
pQue-> nRear = 0;
return TRUE;
}
else
return FALSE;
}

/*出队列。pDataBfr为容纳数据的变量的指针*/
BOOL OutQueue(QUEUE *pQue, NODE **pDataBfr)
{
if (pQue-> bIsEmpty)
return FALSE;
else
{
*pDataBfr = pQue-> pData[pQue-> nFront];
pQue-> nFront++;
if (pQue-> nFront == pQue-> nSize)
pQue-> nFront = 0;
if (pQue-> nFront == pQue-> nRear)
pQue-> bIsEmpty = TRUE;
return TRUE;
}
}

/*二叉树的层次遍历并判断是否为完全二叉树*/
BOOL LevelTraverse(NODE *pRoot)
{
BOOL bResult = TRUE;
BOOL bComfine = FALSE;
NODE *pCurNode;
QUEUE Que;

if (pRoot == NULL)
return TRUE;

InitQueue(&Que,1024); /*这里不考虑队列溢出,在应用中应根据实际情况使用合适
的队列*/
InQueue(&Que,pRoot);

while (OutQueue(&Que,&pCurNode))
{
if (!pCurNode-> pLeft && pCurNode-> pRight)
{
bResult = FALSE;
break;
}
if (bComfine && (pCurNode-> pLeft || pCurNode-> pRight))
{
bResult = FALSE;
break;
}
if (pCurNode-> pLeft)
InQueue(&Que,pCurNode-> pLeft);
if (pCurNode-> pRight)
InQueue(&Que,pCurNode-> pRight);
else
bComfine = TRUE;
}
return bResult;
}

/*简单的测试环境*/

/* 从键盘缓冲区中读取一个不为空格且不为回车的字符 */
char GetNextChar(void)
{
char ch;
do
{
ch = getchar();
} while (ch == ' ' || ch == '\n ');
return ch;
}

/*利用前序遍历序列建立二叉树。扩充结点用‘*’代表。前序序列从键盘输入*/
void CreateTree(NODE *Root)
{
Root-> pLeft = Root-> pRight = NULL;
if (Root-> Data != '* ') /* 如果不为扩充结点, 要建立左结点和右结点 */
{
Root-> pLeft = (NODE *)malloc(sizeof(NODE));
Root-> pLeft-> Data = GetNextChar();
CreateTree(Root-> pLeft);
Root-> pRight = (NODE *)malloc(sizeof(NODE));
Root-> pRight-> Data = GetNextChar();
CreateTree(Root-> pRight);
}
}

/*除去 '* '结点*/
void TrimTree(NODE *pRoot)
{
if (pRoot-> pLeft)
if (pRoot-> pLeft-> Data == '* ')
{
free(pRoot-> pLeft);
pRoot-> pLeft = NULL;
}
else
TrimTree(pRoot-> pLeft);
if (pRoot-> pRight)
if (pRoot-> pRight-> Data == '* ')
{
free(pRoot-> pRight);
pRoot-> pRight = NULL;
}
else
TrimTree(pRoot-> pRight);
}

void main()
{
NODE Root;

Root.Data = GetNextChar();
CreateTree(&Root);
TrimTree(&Root);

printf( "%d\n ",LevelTraverse(&Root));
}
W170532934 2011-07-23
  • 打赏
  • 举报
回复
你的二叉树都没有建立正确哦。
Bitnode* create()
{
char ch;
Bitnode* p = NULL;
scanf("%c",&ch);
if(ch=='x')
{
return NULL;
}
else
{
p = (Bitnode*)malloc(sizeof(Bitnode));
p->data = ch;
p->lchild = create();
p->rchild = create();
return p;
}
}
内容概要:本文提出了一种基于非合作博弈理论的居民负荷分层调度模型,并结合双层鲸鱼优化算法(Two-level Whale Optimization Algorithm)进行高效求解,模型与算法均通过Matlab代码实现。研究针对电力系统中居民侧用电负荷的复杂调度问题,引入非合作博弈机制刻画各用户之间的利益竞争关系,实现负荷的分层优化分配;同时设计双层优化架构,上层优化资源配置,下层模拟用户自主决策行为,提升了模型的实用性与合理性。通过智能优化算法求解多层级、非凸非线性的博弈模型,有效提高了调度方案的收敛性与全局寻优能力,适用于现代智能电网中的需求侧管理与能源优化场景。; 适合人群:具备电力系统基础理论知识和Matlab编程能力,从事智能电网、能源优化调度、需求侧管理、博弈论应用等方向的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于居民区电力负荷的分层优化调度系统设计与仿真分析;②为非合作博弈在多主体能源系统建模中的应用提供方法论支持;③利用双层鲸鱼算法解决具有嵌套结构的复杂双层优化问题,提升求解效率与调度方案的可行性。; 阅读建议:建议读者结合提供的Matlab代码深入理解模型构建逻辑与算法实现流程,重点关注博弈模型的效用函数设计、纳什均衡求解思路以及双层优化结构的迭代机制,宜配合实际用电数据开展复现实验以验证模型有效性与鲁棒性。
内容概要:本文围绕基于自适应神经模糊推理系统(ANFIS)智能控制器的可再生能源微电网功率管理系统展开研究,结合Simulink仿真实现,深入探讨了微电网中功率的智能调控与经济机组组合调度问题。通过引入ANFIS控制器,有效应对风能、光伏等可再生能源出力的波动性与不确定性,提升系统运行的稳定性与电能质量。研究内容涵盖微电网多源协调控制策略、功率平衡管理、优化调度模型构建及仿真验证,实现了对分布式电源、储能系统和负荷的协同优化,兼顾经济性与可靠性目标,并通过仿真平台验证了所提方法的有效性与优越性。; 适合人群:具备电力系统、自动化或新能源相关专业背景,熟悉Matlab/Simulink仿真环境,从事微电网能量管理、智能控制、能源优化等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于高比例可再生能源接入场景下的微电网能量管理系统研发与教学实践;②为实现微电网功率稳定控制与经济高效运行提供先进的智能控制解决方案;③支撑高水平学术论文复现、科研课题攻关及实际工程项目的仿真验证与方案优化。; 阅读建议:建议结合提供的Simulink模型与相关代码进行动手实践,重点关注ANFIS控制器的设计流程、规则库构建与参数调优方法,并通过与传统PID或MPC控制策略的对比实验,深入理解其在动态响应与鲁棒性方面的优势。同时可进一步拓展文中提出的优化调度逻辑,应用于多目标、多约束的复杂实际应用场景中。
内容概要:本文档聚焦于“直流电机双闭环控制Matlab仿真”,系统阐述了基于Matlab/Simulink平台实现直流电机双闭环控制系统(主要包括速度环与电流环)的设计与仿真全过程。通过构建直流电机的数学模型,结合PI控制器进行调控,实现对电机转速和电枢电流的高精度动态控制,验证控制策略的稳定性与响应性能。文档详细介绍了仿真模型的搭建流程、关键参数的整定方法、系统动态波形的分析手段以及仿真结果的有效性验证,体现了经典自动控制理论在实际电机系统中的工程应用,是电机控制与电力电子技术相结合的典型研究案例。; 适合人群:具备自动控制原理、电机与拖动基础、电力电子技术和Matlab/Simulink仿真能力的电气工程、自动化、机电一体化等专业的本科生、研究生及从事电机驱动系统研发的工程技术人员。; 使用场景及目标:①作为高校课程设计或实验教学材料,帮助学生深入理解双闭环调速系统的工作机理与工程实现;②服务于科研项目,为新型电机控制算法(如滑模、模糊PID等)的开发与性能对比提供基础仿真验证平台;③作为工业界产品前期设计的仿真工具,用于评估不同控制策略在动态响应、抗干扰能力和稳态精度方面的可行性。; 阅读建议:建议读者在学习过程中紧密结合自动控制理论知识,亲手在Simulink环境中搭建完整的双闭环仿真模型,通过反复调整PI控制器的比例与积分参数,观察并分析转速、电流的阶跃响应曲线,从而深刻理解反馈控制的本质、系统稳定性条件以及参数整定对动态性能的影响,进而掌握电机控制系统的设计精髓。

70,038

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧