0
点赞
收藏
分享

微信扫一扫

(三十三)判断二叉树是否是平衡二叉树

【平衡二叉树】

  • 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

【树形dp套路】(程序员代码面试指南——左程云)

       如果题目求解目标是S规则,则求解流程可以定成以每个节点为头节点的子树在S规则下的每一个答案,并且答案一定在其中。步骤概述如下:

  • (1)分析答案的可能性:以某个节点X为头节点的子树中,分析答案有哪些可能性,并且分析是以X的左子树、右子树和X整棵树的角度来考虑可能性的。
  • (2)列出所需要的所有信息:依据第一步中答案的可能性,列出所有需要的信息
  • (3)合并第二步信息:合并信息,对左树和右树提出同样的要求,并写出信息结构。
  • (4)设计递归函数:递归函数是处理以X为头节点的情况下的答案,包括设计递归函数的base case,默认直接得到左树和右数的所有信息,以及把可能性整合,并且返回第三步的信息结构。

       就是利用递归函数设计一个二叉树后序遍历的过程:先遍历左子树收集信息,再遍历右子树收集信息,最后在头节点做信息整合。时间复杂度为O(N)。

【本题问题分析】依次考察每个节点为头节点的子树,如果都是平衡二叉树,那么整体都是平衡二叉树

第一步:分析答案可能性

  • 可能性一:如果X的左子树不是平衡的,则以X为头节点的树就是不平衡的
  • 可能性二:如果X的右子树不是平衡的,则以X为头节点的树就是不平衡的
  • 可能性三:如果X的左子树和右子树高度差超过1,则以X为头节点的树就是不平衡的
  • 可能性四:如果上面可能性都没中,那么以X为头节点的树就是平衡的

第二步:列出所需要的信息

  • 左右子树是否平衡
  • 左右子树高度

第三步: 整合信息,定义信息如ReturnType类所示

struct ReturnTyoe{
	bool isBalanced;
	int height;
	ReturnType(bool isBalanced,int height){
		this->isBalanced = isBalanced;
		this->height = height;
	}
};

第四步:设计递归函数

ReturnType* process(TreeNode* head){
    if(head == NULL)
        return new ReturnType(true,0);

    ReturnType* leftData = process(head->left);
    ReturnType* rightData = process(head->right);

    int height = max(leftData->height,rightData->height) + 1;
    bool isBalanced = leftData->isBalanced && rightData->isBalanced && abs(leftData->height - rightData->height) < 2;

    return new ReturnType(isBalanced, height);
}

总的代码为:

/*返回信息体*/
struct ReturnType{
    bool isBalanced;
    int height;
    ReturnType(bool isBalanced,int height){
        this->isBalanced = isBalanced;
        this->height = height;
    }
};
/*递归过程*/
ReturnType* process(TreeNode* head){
    if(head == NULL)
        return new ReturnType(true,0);

    ReturnType* leftData = process(head->left);
    ReturnType* rightData = process(head->right);

    int height = max(leftData->height,rightData->height) + 1;
    bool isBalanced = leftData->isBalanced && rightData->isBalanced && abs(leftData->height - rightData->height) < 2;

    return new ReturnType(isBalanced, height);
}
/*判断是为平衡二叉树*/
bool isBalanced(TreeNode* head){
    return process(head)->isBalanced;
}

举报

相关推荐

0 条评论