剑指offer——61平衡二叉树

题目描述

输入一棵二叉树,判断该二叉树是否是平衡二叉树。
 
题解:
  方法一:使用深度遍历,判断每个节点是不是平衡二叉树,这种从上至下的方法会导致底层的节点重复判断多次
  方法二:使用后序遍历判断,这种方法为自下而上,每个节点只需要判断一次即可
 
  
 1 //方法一:使用深度遍历,判断每个节点是不是平衡二叉树,这种从上至下的方法会导致底层的节点重复判断多次
 2 class Solution01 {
 3 public:
 4     bool IsBalanced_Solution(TreeNode* pRoot) {
 5         if (pRoot == nullptr)return true;
 6         int left = getHeight(pRoot->left);
 7         int right = getHeight(pRoot->right);
 8         if (abs(left - right) > 1)return false;
 9         return IsBalanced_Solution(pRoot->left) && IsBalanced_Solution(pRoot->right);
10     }
11 private:
12     int getHeight(TreeNode *pRoot)
13     {
14         if (pRoot == nullptr)return 1;
15         int left = getHeight(pRoot->left);
16         int right = getHeight(pRoot->right);
17         return max(left, right) + 1;
18     }
19 };
20 
21 //方法二:使用后序遍历判断,这种方法为自下而上,每个节点只需要判断一次即可
22 class Solution02 {
23 public:
24     bool IsBalanced_Solution(TreeNode* pRoot) {
25         if (pRoot == nullptr)return true;
26         int level = 0;
27         return IsBalanced_Solution(pRoot, level);
28     }
29 private:
30     bool IsBalanced_Solution(TreeNode* pRoot, int &level)
31     {
32         if (pRoot == nullptr)
33         {
34             level = 0;
35             return true;
36         }
37         //按照后序遍历去判断左右子树,然后以当前节点为根树的深度
38         int left = 0, right = 0;
39         if (IsBalanced_Solution(pRoot->left, left) && IsBalanced_Solution(pRoot->right, right))
40         {
41             if (abs(left - right) <= 1)
42             {
43                 level = max(left, right) + 1;
44                 return true;
45             }
46         }
47         return false;
48     }
49 };

 

posted @ 2019-10-20 11:44  自由之翼Az  阅读(176)  评论(0编辑  收藏  举报