55_剑指offer_java_二叉树深度 + 平衡二叉树

本文深入探讨了二叉树的深度计算与平衡二叉树的判断方法,通过递归算法解析了树的深度,并介绍了如何使用后序遍历判断一棵树是否为平衡二叉树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

题目一

题目描述

测试用例

解题思路

参考解题

题目二

测试用例

解题思路

参考解题

后序遍历


题目一

 

题目描述

二叉树的深度

输入一颗二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。

二叉树的节点定义如下:

 

测试用例

  • 功能测试(输入普通的二叉树;二叉树中所有节点都没有左/右子树)
  • 特殊输入测试(二叉树只有一个节点;二叉树的头节点为空指针)

 

解题思路

递归思路

一个树的深度可以理解为左、右子树深度的最大值加1。

 

参考解题

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    // 递归
    
    public int TreeDepth(TreeNode root) {
        // 异常
        if(root == null){
            return 0;
        }
        
        return Math.max(TreeDepth(root.left), TreeDepth(root.right)) + 1;
    }
}

 

题目二

平衡二叉树

输入一颗二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树任意节点的左、右子树的深度相差不超过1,那么它就是一颗平衡二叉树。

 

测试用例

  • 功能测试(输入普通的二叉树;不是平衡的二叉树;二叉树中所有节点都没有左/右子树)
  • 特殊输入测试(二叉树只有一个节点;二叉树的头节点为空指针)

 

解题思路

利用树的深度来判断

参考解题思想是树的后序遍历(从下到上)。在每个节点记录它的深度,如果不平衡,则记录该节点的深度为-1。

 

参考解题

public class Solution {
    // 后序遍历,从下往上判断是否为平衡二叉树,-1表示不是AVL
    public boolean IsBalanced_Solution(TreeNode root) {
        // 异常
        if(root == null){
            return true;
        }
        
        return getH(root)!=-1;
    }
    
    //  后序遍历获取高度差,-1表示高度差超过1,不是平衡二叉树
    private int getH(TreeNode root){
        // 异常
        if(root == null){
            return 0;
        }
        
        int nLeft = getH(root.left);
        if(nLeft == -1){
            return -1;
        }
        
        int nRight = getH(root.right);
        if(nRight == -1){
            return -1;
        }
        
        if(Math.abs(nLeft - nRight) > 1){
            return -1;
        }
        
        return Math.max(nLeft, nRight)  + 1; 
    }
}

后序遍历

//后序遍历序列

public List<Integer> postorderTraversal(TreeNode root){
    if(root == null ){
        return null;
    }

    List<Integer> result = new ArrayList();
    return post(root, result);
}

List<Integer> post(TreeNode root, List<Integer> result){
    if(root == null ){
        return null;
    }

    post(root.left, result);
    post(root.right, result);
    result.add(root.val);

    return result;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值