剑指offer_39——平衡二叉树
Posted NLP与深度学习
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer_39——平衡二叉树相关的知识,希望对你有一定的参考价值。
考点:知识迁移能力;知识点:树
题目描述
思路分析:
首先得知道何为平衡二叉树,不然这题没法做。
【百度百科】
平衡二叉树(Balanced Binary Tree)具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。
总结一下就是:
有了求二叉树的深度的经验之后再解决这个问题,我们很容易就能想到一种思路:
1、在遍历树的每个节点的时候,调用求“二叉树的深度”的函数得到节点的左、右子树的深度。
2、如果每个节点的左、右子树的深度都不超过1,那么按照定义它就是一棵平衡二叉树。
优点:只要求出给定二叉树的高度,就可以方便的判断出二叉树是平衡二叉树,思路简单,代码简洁。
缺点:由于每个节点都会被重复遍历多次,这造成时间效率不高。例如在上面的函数输入
解法二:
1.采用后序遍历的方式遍历二叉树的每一个节点
2.在遍历到一个根节点之前,我们就已经遍历了它的左右子树。
3.此时,记录每个节点为根节点的树的高度,就可以一边遍历一边判断每个节点是不是平衡的。
源码
C++
#include<math.h>
class Solution {
public:
bool IsBalanced_Solution(TreeNode* pRoot) {
if(pRoot==NULL){
return true;
}
int left = getDepth(pRoot->left);
int right = getDepth(pRoot->right);
int diff = left-right;
if(diff>1 || diff<-1){
return false;
}
return IsBalanced_Solution(pRoot->left) && IsBalanced_Solution(pRoot->right);
}
// 获取根节点
int getDepth(TreeNode* root){
if(root==NULL){
return 0;
}
int left = getDepth(root->left);
int right = getDepth(root->right);
int res = left = left>right?left:right;
return res+1;
}
};
改进:
class Solution {
public:
bool IsBalanced_Solution(TreeNode* pRoot) {
int depth = 0;
return isBalance(pRoot,depth);
}
bool isBalance(TreeNode* pRoot, int &pDepth){
if(!pRoot){
pDepth = 0;
return true;
}
// 记录左节点和右 节点的深度
int left = 0;
int right = 0;
// 采用传引用的方式,下层递归进行对深度进行修改以后,影响上一层
if(isBalance(pRoot->left,left) && isBalance(pRoot->right,right)){
if(abs(left-right)<=1){ // 计算平衡因子
pDepth = 1+(left>right?left:right);
return true;
}
}
return false;
}
};
python
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 获取树的深度
def IsBalanced_Solution(self, pRoot):
# write code here
self.flag = True
self.getDepth(pRoot)
return self.flag
def getDepth(self,pRoot):
if not pRoot or self.flag==False:
return 0
left = self.getDepth(pRoot.left)
right = self.getDepth(pRoot.right)
if abs(left-right)>1:
self.flag = False
return left+1 if left>right else right+1
那就继续下一个题目吧,这道题上面花费的时间真的是太多了。
以上是关于剑指offer_39——平衡二叉树的主要内容,如果未能解决你的问题,请参考以下文章