二叉树的结构

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

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

//由左节点和右节点以及一个节点值构成   
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;
}
}

二叉树的深度<java版>的更多相关文章

  1. 剑指offer【08】- 二叉树的深度(java)

    题目:二叉树的深度 考点:知识迁移能力 题目描述:输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 牛客网上的剑指offer题, ...

  2. 实现二叉树的基本操作(Java版)

    近期研究了一下二叉树,试着用Java语言实现了二叉树的基本操作,下面分享一下实现代码: package com.sf.test; import java.util.ArrayDeque; import ...

  3. 二叉树的宽度<java版>

    二叉树的宽度 思路:层序遍历的时候,记录每层的节点数量,最后取记录中的最多的数量. 代码实现: public int solution(TreeNode node){ LinkedList<Tr ...

  4. 《剑指offer》面试题19 二叉树的镜像 Java版

    书中方法:这道题目可能拿到手没有思路,我们可以在纸上画出简单的二叉树来找到规律.最后我们发现,镜像的实质是对于二叉树的所有节点,交换其左右子节点.搞清楚获得镜像的方法,这道题实际上就变成了一道二叉树遍 ...

  5. 将一个二叉树左右翻转(Java 版)

    public class Solution { public TreeNode invertTree(TreeNode root) { if (root == null) { return null; ...

  6. 剑指Offer面试题39(Java版):二叉树的深度

    题目:输入一棵二叉树的根节点,求该数的深度. 从根节点到叶结点依次进过的结点(含根,叶结点)形成树的一条路径,最长路径的长度为树的深度. 比如.例如以下图的二叉树的深度为4.由于它从根节点到叶结点的最 ...

  7. C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解

    剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...

  8. 二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)

    将二叉树相关的操作集中在一个实例里,有助于理解有关二叉树的相关操作: 1.定义树的结构体: typedef struct TreeNode{ int data; struct TreeNode *le ...

  9. 【剑指offer】Java版代码(完整版)

    原文地址:https://blog.csdn.net/baiye_xing/article/details/78428561 一.引言 <剑指offer>可谓是程序猿面试的神书了,在面试中 ...

随机推荐

  1. `ECS弹性计算服务

    云服务器(Elastic Compute Service 简称ECS)是一种简单高效,处理能力可弹性伸缩的计算服务.能快速构建更稳定.安全的应用,提升运维效率,降低IT成本. 云服务器ecs作用如下: ...

  2. Vue 子组件调用父组件 $emit

    <!DOCTYPE html><html>    <head>        <meta charset="utf-8">      ...

  3. Dubbo实践(九)ExtensionFactory

    ExtensionLoader.java中注意到injectExtension函数是为了设置所生成的对象的field:其方法为对于有set函数的field进行设置.此时用到了ExtensionFact ...

  4. POJ 2352 stars (树状数组入门经典!!!)

    Stars Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 54352   Accepted: 23386 Descripti ...

  5. java程序陷阱

    1.找奇数

  6. Centos7在线安装MySQL

    wget dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpmyum localinstall mysql57-community- ...

  7. 纯swift开发,弹幕,演唱会广告牌

    最近去了次演唱会,看见有人在用这个,刚好没事,我自己也写了一个. 顺手练一练swift,第一个纯swift开发工程. 支持字体大小切换,滚动速度切换,字体切换,字体颜色切换 工程Git:https:/ ...

  8. Vue 源码分析—— 目录结构

    一,Vue.js 的源码都是在src 目录下,其目录结构如下. 1.compiler 目录包含Vue.js 所有编译相关的代码.它包括把所有模板解析成ast 语法树, ast 语法树优化等功能. 2. ...

  9. 前端基础-jQuery中的如何操作标签

    阅读目录 样式操作 文本操作 属性操作 文档操作 一.样式操作 1.样式类 addClass();// 添加指定的CSS类名. removeClass();// 移除指定的CSS类名. hasClas ...

  10. flAbsPath on /var/lib/dpkg/status failed 解决 Cydia 红字

    越狱之后抹掉所有数据,然后再使用 doubleH3lix 越狱成功后,打开 Cydia 会提示如下错误: flAbsPath on /var/lib/dpkg/status failed - real ...