【平衡二叉树】
- 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过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;
}