《剑指Offer》面试题:平衡二叉树

题目

输入一个二叉树的根节点,
判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过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;
}
    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/u010412719/article/details/49055361
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞