二叉树的深度<java版>

二叉树的结构

二叉树是比较常见的一种的一种数据结构。

首先看看二叉树的数据结构:

//由左节点和右节点以及一个节点值构成   
public class TreeNode{ TreeNode leftNode; TreeNode rightNode; int val; TreeNode(int val){ this.val=val; this.leftNode=null; this.rightNode=null; } }

正是由于二叉树的这个结构,所以我们常用遍历解决二叉树的相关问题。

二叉树的深度问题

二叉树的深度问题主要分为两种,最大深度和最小深度。

最大深度:即二叉树的高度

递归思路:递归跳出条件是判断一个节点是否是空,如果为空则跳出,如果不为空则加一继续递归。最后的返回值只需返回左子树和右子树中的最大值。

代码实现:

public int deepthTree(TreeNode node){
        if (node==null){
            return 0;  //递归跳出条件
        }
      return Math.max(deepthTree(node.leftNode),deepthTree(node.rightNode))+1;
}

非递归思路:采用二叉树的层序遍历的思想(层序遍历为我们可以采用队列进行辅助操作)。我们需要遍历每层,每遍历完一层则将level进行加一的操作。这个问题的关键在于如何知道每层是否遍历完了,我们可以定义一个初始变量cur,然后将cur和每层的进入队列的节点的size进行比较,判断是否遍历完这个层的最后一个节点。

代码实现:

  public int deepthTree(TreeNode node){
        //非递归实现
        LinkedList<TreeNode> queue=new LinkedList<>();  //设置队列
        queue.offer(node);  //将根节点入队列
        TreeNode bitTree=null;  
        int level=0;
        while (!queue.isEmpty()){
            int cur=0;  //当每层遍历完的时候,cur恢复初始值
            int length=queue.size();
            while (cur<length){
                bitTree=queue.poll();
                cur++;
                if (bitTree.leftNode!=null) {
                    queue.offer(bitTree.leftNode);
                }
                if (bitTree.rightNode!=null) {
                    queue.offer(bitTree.rightNode);
                }
            }
            level++;  //层数进行++
        }
        return level;
    }

最小深度

参考别人整理的思路:

思路:

1.没有根节点,那结果就是0 
2.有根节点,没有左右子树,结果为1 
3.没有左子树,有右子树。把右子树看成一棵新的树。 
4.没有右子树,有左子树。把左子树看成一棵新的树。 
5.既有左子树,又有右子树。那就把左右子树分别都看成新的树,最后比较谁的最近叶子的路径短,就取哪边。 
---------------------  
原文:https://blog.csdn.net/sinat_35803474/article/details/70040544 

代码实现:

 public int deepthTree(TreeNode node){
        //<--最小深度-->
        if (node==null){
            return 0;
        }
        if (node.leftNode==null && node.rightNode==null){
            return 1;
        }
        if (node.rightNode==null){
            return deepthTree(node.leftNode)+1;
        }else if (node.leftNode==null){
            return deepthTree(node.rightNode)+1;
        }else {
            return Math.min(deepthTree(node.leftNode),deepthTree(node.rightNode))+1;
        }
    }      

 

转载于:https://www.cnblogs.com/LcMiho/p/10113516.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值