!!!题解 | 判断是不是平衡二叉树 写代码之前要多想 注意递归函数的返回值有重要作用
判断是不是平衡二叉树
https://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
#include <algorithm>
#include <cmath>
#include <ios>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return bool布尔型
*/
bool IsBalanced_Solution(TreeNode* pRoot) {
// write code here
//求任意节点的高度
//求任意节点的高度也并不是从顶到下或者是从上到顶都可以的,只能是从下到上传递.因为从顶到上根本无法判断这棵树是不是平衡二叉树
//那么应该怎么从上从下到上的高度呢,当前节点的高度是多少呢,它的高度应该是左节点和右节点其中的最大的高度加一
//函数应该怎么写呢,分析到这儿应该可以知道应该传递的是当前结点的高度,那么就需要一个int类型。可是它还需要表示当前节点是否是平衡二叉树,没问题,这也可以使用int,因为高度肯定大于零,所以他只要选一个负数比如负一,就代表他不符合平衡二叉树,可以退出
int res=gethigh(pRoot);
if(res==-1)return false;
else return true;
}
/*
bool depth(TreeNode* root,int lefthigt,int righthigt){
if(root==nullptr){
return 1;
}
int left=depth(root->left,lefthigt+1,righthigt);
int right=depth(root->right,left,righthigt+1);
int high=abs(left-right);
if(high>1)return false;
else return 1;
*/
//这段代码不对,因为是凭感觉写的,并没有分析怎么去分治写代码
int gethigh(TreeNode* root){
if(root==nullptr)return 0;
int left=gethigh(root->left);//这里又有一些混乱,是因为不知道这个函数的返回值是怎么传递的,它其实就是在调用这个函数的时候返回一个信息,这个信息可以穿越当前层被保存下来,声明一个int类型变量去接收这个值,接受的其实是这一层的高度.
if(left==-1)return -1;//这里return的是负一,因为这一层不符合所有层都不符合.需要向上传递,直到退出所有所有函数
int right=gethigh(root->right);
if(right==-1)return -1;
int high=abs(left-right);
if(high>1)return -1;
else return max(left, right)+1;
}
};