二叉树5:平衡二叉树判断

题目:有一棵二叉树,请设计一个算法判断这棵二叉树是否为平衡二叉树。给定二叉树的根结点root,请返回一个bool值,代表这棵树是否为平衡二叉树。

思路:根据定义,要判断一棵二叉树是否是平衡二叉树需要判断树上的每一个结点的左右子树的高度差是否小于等于1,显然需要遍历左右的根结点。其实对于二叉树而言,遍历时使用的遍历方式无非是先序遍历、中序遍历、后序遍历、按层遍历,选取合适的遍历方式即可。其中,先序遍历实际上是从上到下遍历结点的,由于是先根结点再左右子树,因此大致上是从上到下进行的;中序遍历是先左子树再中间根结点再右子树,因此大致上是从下开始的;后序遍历是先左结点再右结点再根结点,因此大致上是从下向上的,按层遍历特征太明显,从上到下,从左到右。本题中,要判断是否是平衡二叉树,需要对每个结点进行判断,对于每个结点又要得到它的左右子树的高度,如果从上到下遍历会对下部的子树进行多次的重复判断因此应该从下往上遍历子树判断子树是否平衡,即先判断左子树是否平衡,并求出其最大的高度,如果不平衡则整棵树不平衡;同理再求右子树是否平衡以及求出最大的高度,如果不平衡则整棵树不平衡;如果左右子树都平衡,那么比较2左右子树是否平衡即可,显然这是一个递归的过程。由于是先遍历左子树,再遍历右子树再遍历根结点,因此显然应该对后续遍历进行改造。

《二叉树5:平衡二叉树判断》

二叉树难的地方在于很多时候需要使用递归,而且是需要携带返回值的递归,此时高度抽象,但是不要灰心,需要多理解,多练习,找找感觉。

很巧妙,很简单:

其实还是一个递归的过程,构造一个递归函数,函数的功能是给定一个一棵子树的根结点root,返回这棵树的高度:递推关系是:对于任何一个跟结点,它的高度是其左右子树高度+1,即比较得到2个子树的高度,选取较大的高度+1即为当前结点的高度,于是求某个结点的高度转化为求它的子树的高度,这显然是一个递推的过程,递推的边界条件是当一直向下递推时,如果某个结点的子树为null,那么这棵子树的高度为0,同时表示到达叶子结点,递归结束return即可。由于需要判断是否是平衡二叉树,于是在求出左右子树的高度同时稍微改编加一些逻辑即可:

写一个递归函数,输入一个根结点,判断这个根结点所在的树是否是平衡二叉树,如果是则返回这棵树的高度,如果不是就返回-1;

①递归的递推条件:判断一棵二叉树是否平衡并求出高度,可以转化为分别判断左右二叉树是否平衡并求出其高度,如果有某一棵子树不是平衡的就直接return -1,如果2子树都不返回-1,那么判断2子树返回的高度差是否<=1,如果不是则返回-1,如果是就返回2棵子树中高度较大的值作为当前子树的高度。

②基准情形:当root为null时,说明是求null结点的高度,显然是0,直接返回0即可。

基准情形也可以理解为边界条件,因为此时的结果是明显的,不需要递归调用,可以直接返回一个明确的值,或者不返回值而是直接return,例如之前遍历时当stack==null时直接return也可以认为是基准情形。

关键是根据逻辑要求构造出一个递归函数。

import java.util.*;
//判断一棵二叉树是否是平衡二叉树,使用递归,以子树的高度作为返回值
public class CheckBalance {
    public boolean check(TreeNode root) {
        //调用递归方法来判断是否是平衡的
        //如果返回-1表不平衡,如果返回一个具体的值,说明树平衡,返回的是树的高度值
        boolean result=this.getHeight(root)==-1?false:true;
        return result;
    }
    //这是一个递归的方法,用于返回一棵二叉树的高度,如果平衡返回高度,如果不平衡返回-1
    private int getHeight(TreeNode root){
        //基准情形
        if(root==null) return 0;
        //先求左子树的高度
        int leftHeight=this.getHeight(root.left);
        //判断左子树是否平衡,调用递归方法后总是认为这个方法已经全部执行完毕
        if(leftHeight==-1) return -1;
        //再求右子树的高度
        int rightHeight=this.getHeight(root.right);
        //判断右子树是否平衡
        if(rightHeight==-1) return -1;
        //判断高度差是否过大
        if(Math.abs(leftHeight-rightHeight)>1) return -1;
        //执行到此处说明二叉树平衡,返回此树的高度(子树较大值+1)
        return Math.max(leftHeight,rightHeight)+1;
    }
}

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/qq_27703417/article/details/70960005
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞