题目
输入一个二叉树的根节点,
判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
思路:
用后序遍历实现
先遍历节点的左右子树,左右子树都平衡才来判断该节点是否平衡,如果左右子树中有不平衡的,则直接返回false,避免了从上往下逐个节点地计算深度带来的重复遍历节点。
#include<stdio.h>
#include<stdlib.h>
struct BTreeNode{
int mValue;
struct BTreeNode *pLChild;
struct BTreeNode *pRChild;
};
//判断一个节点是否平衡,要先遍历该节点的左右子树是否平衡,若都平衡,则该节点平衡,否则该节点就不平衡。
//需要用后续遍历来进行递归求解。
bool isBalanceBTree(BTreeNode *pRoot,int *pLeftHeight,int *pRightHeight){
}
//只是为了测试,这里就只是简单的新建一个二叉树
//本来以为这样建二叉树要简单些,没想到,写的好累呀
BTreeNode *createBTree(){
BTreeNode *pNode1=(BTreeNode *)malloc(sizeof(BTreeNode));
BTreeNode *pNode2=(BTreeNode *)malloc(sizeof(BTreeNode));
BTreeNode *pNode3=(BTreeNode *)malloc(sizeof(BTreeNode));
BTreeNode *pNode4=(BTreeNode *)malloc(sizeof(BTreeNode));
BTreeNode *pNode5=(BTreeNode *)malloc(sizeof(BTreeNode));
if(pNode1==NULL||pNode2==NULL||pNode3==NULL||pNode4==NULL||pNode5==NULL){
exit(EXIT_FAILURE);
}
pNode1->mValue=8;
pNode1->mValue=4;
pNode1->mValue=5;
pNode1->mValue=10;
pNode1->mValue=3;
pNode1->pLChild=pNode2;
pNode1->pRChild=pNode3;
pNode2->pLChild=pNode4;
pNode2->pRChild=pNode5;
pNode3->pLChild=NULL;
pNode3->pRChild=NULL;
pNode4->pLChild=NULL;
pNode4->pRChild=NULL;
pNode5->pLChild=NULL;
pNode5->pRChild=NULL;
}
bool isBalanceBTree(BTreeNode *pBTNode,int* deep){
if(pBTNode==NULL){//当递归到叶子节点时,深度为 0;
deep=0;
return true;
}
int leftDeep,rightDeep;
if(isBalanceBTree(pBTNode->pLChild, &leftDeep)&&isBalanceBTree(pBTNode->pRChild, &rightDeep)){
if(leftDeep-rightDeep<=1||rightDeep-leftDeep<=1){
*deep=(leftDeep>rightDeep?leftDeep:rightDeep)+1;//节点的深度为左右子树的深度的较大者+1
return true;
}
else{
return false;
}
}
}
bool isBalanceBTree(BTreeNode *pBTNode){
if(pBTNode==NULL)
return false;
int deep;
return isBalanceBTree(pBTNode,&deep);
}
int main(void){
BTreeNode *pBTNode=createBTree();
if(isBalanceBTree(pBTNode)){
printf("balance\n");
}
else{
printf("not balance\n");
}
return 0;
}