【剑指offer】推断二叉树平衡

时间:2022-05-30 15:02:25

版权声明:本文为博主原创文章。未经博主同意不得转载。

https://blog.csdn.net/mmc_maodun/article/details/27242575

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27242575

    题目:输入一个二叉树的根节点,推断该树是不是平衡二叉树。假设某二叉树中随意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

    剑指offer上给的另外一种思路。用后序遍历真的是将递归发挥的淋漓尽致,先遍历节点的左右子树。左右子树都平衡才来推断该节点是否平衡,假设左右子树中有不平衡的。则直接返回false,避免了从上往下逐个节点地计算深度带来的反复遍历节点。

    代码例如以下:

#include<stdio.h>
#include<stdlib.h> typedef struct BTNode
{
char data;
struct BTNode *pLchild;
struct BTNode *pRchild;
}BTNode, *BTree; BTree create_tree();
bool IsBalanced(BTree,int *);
bool IsBalanced(BTree); int main()
{
BTree pTree = create_tree();
if(IsBalanced(pTree))
printf("Balanced\n");
else
printf("Not Balanced\n"); return 0;
} BTree create_tree()
{
BTree pA = (BTree)malloc(sizeof(BTNode));
BTree pB = (BTree)malloc(sizeof(BTNode));
BTree pD = (BTree)malloc(sizeof(BTNode));
BTree pE = (BTree)malloc(sizeof(BTNode));
BTree pC = (BTree)malloc(sizeof(BTNode));
BTree pF = (BTree)malloc(sizeof(BTNode)); pA->data = 'A';
pB->data = 'B';
pD->data = 'D';
pE->data = 'E';
pC->data = 'C';
pF->data = 'F'; pA->pLchild = pB;
pA->pRchild = pC;
pB->pLchild = pD;
pB->pRchild = pE;
pD->pLchild = NULL;
pD->pRchild = NULL;
pE->pLchild = pE->pRchild = NULL;
pC->pLchild = NULL;
pC->pRchild = pF;
pF->pLchild = pF->pRchild = NULL; return pA;
} /*
兴许递归遍历推断二叉树是否平衡
*/
bool IsBalanced(BTree pTree,int *depth)
{
if(pTree == NULL)
{
*depth = 0;
return true;
} int leftDepth,rightDepth;
if(IsBalanced(pTree->pLchild,&leftDepth) && IsBalanced(pTree->pRchild,&rightDepth))
{
int diff = leftDepth-rightDepth;
if(diff<=1 && diff>=-1)
{
*depth = (leftDepth>rightDepth ? leftDepth:rightDepth) + 1;
return true;
}
}
return false;
} /*
封装起来
*/
bool IsBalanced(BTree pTree)
{
int depth = 0;
return IsBalanced(pTree,&depth);
}

    測试结果:

【剑指offer】推断二叉树平衡