树————平衡二叉树

求二叉树是否平衡,根据题目中的定义,高度平衡二叉树是每一个结点的两个子树的深度差不能超过1,那么我们肯定需要一个求各个点深度的函数,然后对每个节点的两个子树来比较深度差,时间复杂度为O(NlgN),代码如下:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     //求左右子树深度差,那我们需要一个求左右子树深度的函数,然后比较就可以了
13     bool isBalanced(TreeNode* root) {
14         if(!root) return true;//空树也是平衡二叉树,单节点也是平衡二叉树
15         if(abs(getdepth(root->left)-getdepth(root->right)) > 1) return false;
16         return isBalanced(root->left) && isBalanced(root->right);
17     }
18     //得到每个节点为root时候的深度,平衡二叉树要求每个节点都复合这样的。
19     int getdepth(TreeNode *root){
20         if(!root) return 0;
21         return 1+max(getdepth(root->left),getdepth(root->right));
22     }
23 };

上面的方法每个点计算深度的时候都会被访问一次,我们可以进行优化。方法是如果我们发现子树不平衡,则不计算具体的深度,而是直接返回-1。那么优化后的方法为:对于每一个节点,我们通过checkDepth方法递归获得左右子树的深度,如果子树是平衡的,则返回真实的深度,若不平衡,直接返回-1,此方法时间复杂度O(N),空间复杂度O(H),参见代码如下:

 1 class Solution {
 2 public:    
 3     bool isBalanced(TreeNode *root) {
 4         if (checkDepth(root) == -1) return false;
 5         else return true;
 6     }
 7     int checkDepth(TreeNode *root) {
 8         if (!root) return 0;
 9         int left = checkDepth(root->left);
10         if (left == -1) return -1;
11         int right = checkDepth(root->right);
12         if (right == -1) return -1;
13         int diff = abs(left - right);
14         if (diff > 1) return -1;
15         else return 1 + max(left, right);
16     }
17 };

 

posted @ 2019-06-22 15:51  Austin_anheqiao  阅读(168)  评论(0编辑  收藏  举报