• 二叉树的深度<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;
            }
        }      
  • 相关阅读:
    【python】第一个爬虫:用requests库爬取网页内容
    【python】UDP协议编程
    【python】体育竞技分析:预测球队比赛成绩
    【python】手绘图制作
    【python】成绩表雷达图
    【python】numpy库和matplotlib库学习笔记
    【python】PIL库之图片处理
    【python】PIL库学习总结
    【python】利用jieba中文分词进行词频统计及生成词云
    汉诺塔问题
  • 原文地址:https://www.cnblogs.com/LcMiho/p/10113516.html
Copyright © 2020-2023  润新知