题目描述:
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
思路分析:
首先要明确平衡二叉树的定义。平衡二叉是左右子树的高度差小于等于1,且左右子树都为平衡二叉树。这里就存在一个递归判断左右子树是否为平衡二叉树的操作。可以根据之前求二叉树的高度问题来求解,首先求得当前树的左右子树高度,若满足高度差小于等于1,再进一步判断左右子树。
进一步优化以上的过程,考虑到每一次求二叉树树高度时,存在重复遍历树结点的问题。所以考虑将每个二叉树的高度存下来。
代码:
1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) { 8 } 9 };*/ 10 class Solution { 11 public: 12 int deepTree(TreeNode* pRoot) 13 { 14 if(pRoot==nullptr) 15 return 0; 16 int count=0; 17 if(pRoot->left==nullptr && pRoot->right==nullptr) 18 return count+1; 19 count++; 20 return count+max(deepTree(pRoot->left), deepTree(pRoot->right)); 21 } 22 bool IsBalanced_Solution(TreeNode* pRoot) { 23 if(pRoot==nullptr) 24 return true; 25 int left = deepTree(pRoot->left); 26 int right = deepTree(pRoot->right); 27 if(left-right>1 || left-right<-1) 28 return false; 29 else 30 { 31 return (IsBalanced_Solution(pRoot->left) && IsBalanced_Solution(pRoot->right)); 32 } 33 } 34 };
优化代码:
1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) { 8 } 9 };*/ 10 class Solution { 11 public: 12 bool IsBalanced_Solution(TreeNode* pRoot) { 13 int depth=0; 14 return IsBalanced(pRoot,depth); 15 } 16 17 bool IsBalanced(TreeNode* pRoot,int& depth){ 18 if(pRoot==NULL){ 19 depth=0; 20 return true; 21 } 22 int left,right,diff; 23 if(IsBalanced(pRoot->left,left) && IsBalanced(pRoot->right,right)){ 24 diff=left-right; 25 if(diff<=1 && diff>=-1){ 26 depth=left>right?left+1:right+1; 27 return true; 28 } 29 } 30 return false; 31 } 32 };