LeetCode 110.平衡二叉树(C++)
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3 / \ 9 20 / \ 15 7
返回 true
。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1 / \ 2 2 / \ 3 3 / \ 4 4
返回 false
。
#include <iostream> #include <numeric> #include <algorithm> using namespace std; static int x = []() {std::ios::sync_with_stdio(false); cin.tie(0); return 0; }(); struct TreeNode { int value; TreeNode* left; TreeNode* right; TreeNode(int x) :value(x), left(NULL), right(NULL) {} }; class Solution { public: bool isBalanced(TreeNode* root) { if (!root)//当二叉树为空时,依然满足平衡二叉树要求 return true; Rec(root); return flag; } int Rec(TreeNode* T) { if (!T) {//递归结束条件,当递归到叶子节点末端结束 return 0; } else { /*以[1,2,2,3,null,null,3,4,null,null,4]举例 整体理解好一点: 先左再右(先搜索根结点左边的左叶子节点,再搜索根结点左边的右叶子节点;再搜索根结点右边的左叶子节点...) 当搜索到左边左叶子节点末端,对子节点(假设中的"根结点")来说,高度为0。left = 0, right = 0,这个阶段结束,返回1("根结点") 当开始回退到上一个节点,此时left = 1, 执行Rec(T->right)=>right = 0;函数结束,返回max(left, right)+1 = 2 此时left = 2,...right = 0... 最后反馈给根结点的是max(left=3, right=0)+1,flag = false; 接着,开始搜索右叶子树,上面的相同,不过是将函数返回值用right接收 */ int left = Rec(T->left); int right = Rec(T->right); if (abs(left - right) > 1) flag = false; return max(left, right) + 1;//+1的原因是要加上根结点 } } private: bool flag = true;//当二叉树是平衡二叉树时,不会对flag进行任何操作 }; int main() { system("PAUSE"); return 0; }