微软面试题: LeetCode 110. 平衡二叉树 easy 出现次数:3
题目描述:
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
分析:
二叉树的题目优先考虑递归解法。设计的递归函数完成两个功能:
1. 求当前二叉树的高度 depth;
这里二叉树的高度指的是二叉树的最深路径上的节点数,不用边数是为了区分 二叉树根为空指针(depth = 0)和
二叉树只有一个节点(depth = 1)这两种情况。
若二叉树根为空指针 depth = 0; //递归出口
若二叉树只有一个节点 depth = 1;//递归出口
其他情况 depth = max(left_depth,right_depth);
2. 判断当前二叉树是不是平衡二叉树;
将求左右子树的高度和判断其是否是平衡二叉树的任务分派给递归函数后,若 左右子树都是平衡二叉树且
左右子树的高度差不大于1 该二叉树是平衡二叉树,否则不是平衡二叉树。
若二叉树根为空指针 return true; //递归出口
若二叉树只有一个节点 return true;//递归出口
其他情况 return left_balcance && right_balance && abs(left_depth-right_depth) <=1
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode() : val(0), left(nullptr), right(nullptr) {} 8 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} 9 * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} 10 * }; 11 */ 12 class Solution { 13 public: 14 bool isBalanced(TreeNode* root) 15 { 16 int depth = 0; 17 return isBalancedHelper(root,depth); 18 } 19 //为了区分root空指针和root只有一个节点的情况 20 //depth 表示二叉树最深路径上的节点数,不是边的数量 21 //空指针depth = 0; 只有一个节点depth = 1; 22 bool isBalancedHelper(TreeNode* root,int &depth) 23 { 24 if(root == nullptr ) 25 { 26 depth = 0; 27 return true; 28 } 29 int left_depth = 0; 30 bool left_balance = isBalancedHelper(root->left,left_depth); 31 int right_depth = 0; 32 bool right_balance = isBalancedHelper(root->right,right_depth); 33 if(root->left == nullptr && root->right == nullptr) 34 { 35 depth = 1; 36 return true; 37 } 38 depth = max(left_depth,right_depth) + 1; 39 if(left_balance && right_balance && abs(left_depth - right_depth) <= 1) 40 { 41 return true; 42 } 43 else 44 { 45 return false; 46 } 47 } 48 };