剑指offer:平衡二叉树
Posted lj-lj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer:平衡二叉树相关的知识,希望对你有一定的参考价值。
题目描述:
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
思路分析:
首先要明确平衡二叉树的定义。平衡二叉是左右子树的高度差小于等于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 ;
以上是关于剑指offer:平衡二叉树的主要内容,如果未能解决你的问题,请参考以下文章