剑指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:平衡树,即平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
2:平衡二叉树的常用算法有红黑树、AVL、Treap、伸展树、SBT等。



有了求二叉树的深度的经验之后再解决这个问题,我们很容易就能想到一种思路: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——平衡二叉树的主要内容,如果未能解决你的问题,请参考以下文章

《剑指offer》:[39-1]判断是否为平衡二叉树

剑指Offer39:平衡二叉树(Java)

剑指OFFER 平衡二叉树

Java 剑指offer(55-2) 平衡二叉树

剑指Offer37 二叉树深度与平衡二叉树判断

剑指Offer平衡二叉树(树)