初识数据结构——二叉树从基础概念到实践应用

初识数据结构——二叉树从基础概念到实践应用


数据结构专栏 ⬅(click)

初识二叉树:从基础概念到实践应用🌳

一、树型结构基础

1.1 树的基本概念

在这里插入图片描述

树是一种非线性的数据结构,由n(n>0)个有限节点组成一个具有层次关系的集合。它看起来像一棵倒挂的树,根朝上而叶朝下。

关键特点:有且仅有一个根节点,没有前驱节点除根节点外,其余节点被分成M(M>0)个互不相交的子树树是递归定义的
重要术语结点的度:一个结点含有子树的个数树的度:树中所有结点度的最大值叶子结点:度为0的结点双亲结点/父结点:含有子结点的结点孩子结点/子结点:一个结点含有的子树的根结点根结点:没有双亲结点的结点结点的层次:从根开始定义,根为第1层树的高度/深度:树中结点的最大层次

1.2 树的表示方法

最常用的表示方法是孩子兄弟表示法

classNode{int value;// 树中存储的数据Node firstChild;// 第一个孩子引用Node nextBrother;// 下一个兄弟引用}
在这里插入图片描述

二、二叉树详解

2.1 二叉树概念

二叉树是结点的一个有限集合,该集合:

  1. 或者为空
  2. 或者由一个根节点加上两棵分别称为左子树和右子树的二叉树组成

特点

  • 二叉树不存在度大于2的结点

二叉树的子树有左右之分,次序不能颠倒,是有序树

在这里插入图片描述

2.2 特殊二叉树

  1. 满二叉树:每层的结点数都达到最大值。层数为K,结点总数是2^K-1

完全二叉树:深度为K,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从0至n-1的结点一一对应

在这里插入图片描述

2.3 二叉树的性质

  1. 非空二叉树的第i层最多有2^(i-1)个结点
  2. 深度为K的二叉树最大结点数是2^K-1
  3. 对于任何二叉树,n0(叶子结点) = n2(度为2的结点) + 1
  4. 具有n个结点的完全二叉树深度为⌈log₂(n+1)⌉
  5. 完全二叉树的父子结点关系:
    • 父结点序号:(i-1)/2
    • 左孩子序号:2i+1
    • 右孩子序号:2i+2

2.4 二叉树的存储

链式存储
// 孩子表示法classNode{int val;// 数据域Node left;// 左孩子引用,常常代表左孩⼦为根的整棵左⼦树 Node right;// 右孩子引用,常常代表右孩⼦为根的整棵右⼦树 }// 孩子双亲表示法classNode{int val;Node left;// 左孩子引用,常常代表左孩⼦为根的整棵左⼦树 Node right;// 右孩子引用,常常代表右孩⼦为根的整棵右⼦树 Node parent;// 当前节点的根节点}

三、二叉树遍历

遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做⼀次且仅做⼀次访问。访问结点所做的操作依赖于具体的应⽤问题(比如:打印节点内容、节点内容加1)。遍历是⼆叉树上最重要的操作之一,是二叉树上进行其它运算之基础。

在这里插入图片描述

3.1 递归遍历

  1. (NLR)前序遍历:根节点 -> 左子树 -> 右子树
  2. (LNR)中序遍历:左子树 -> 根节点 -> 右子树

(LRN)后序遍历:左子树 -> 右子树 -> 根节点

在这里插入图片描述
// 前序遍历voidpreOrder(Node root){if(root ==null)return;System.out.print(root.val +" ");preOrder(root.left);preOrder(root.right);}// 中序遍历voidinOrder(Node root){if(root ==null)return;inOrder(root.left);System.out.print(root.val +" ");inOrder(root.right);}// 后序遍历voidpostOrder(Node root){if(root ==null)return;postOrder(root.left);postOrder(root.right);System.out.print(root.val +" ");}

3.2 层序遍历

从根节点出发,按层次从上到下、从左到右访问结点。

voidlevelOrder(Node root){if(root ==null)return;Queue<Node> queue =newLinkedList<>(); queue.offer(root);while(!queue.isEmpty()){Node cur = queue.poll();System.out.print(cur.val +" ");if(cur.left !=null) queue.offer(cur.left);if(cur.right !=null) queue.offer(cur.right);}}

四、二叉树基本操作

代码示例:

// 获取节点个数intsize(Node root){if(root ==null)return0;return1+size(root.left)+size(root.right);}// 获取叶子节点个数intgetLeafNodeCount(Node root){if(root ==null)return0;if(root.left ==null&& root.right ==null)return1;returngetLeafNodeCount(root.left)+getLeafNodeCount(root.right);}// 获取第k层节点个数intgetKLevelNodeCount(Node root,int k){if(root ==null|| k <=0)return0;if(k ==1)return1;returngetKLevelNodeCount(root.left, k-1)+getKLevelNodeCount(root.right, k-1);}// 获取二叉树高度intgetHeight(Node root){if(root ==null)return0;return1+Math.max(getHeight(root.left),getHeight(root.right));}// 查找值为val的节点Nodefind(Node root,int val){if(root ==null)returnnull;if(root.val == val)return root;Node left =find(root.left, val);if(left !=null)return left;returnfind(root.right, val);}

结语

二叉树是数据结构中的核心内容,掌握好二叉树对于理解更复杂的数据结构和算法至关重要。建议读者在学习理论的同时,多动手实现代码,解决实际问题,才能真正掌握二叉树的精髓。


在这里插入图片描述

Read more

从0到上线只需3小时!飞算JavaAI引爆全民编程革命:不懂代码也能做系统,AI全自动开发时代来了!

从0到上线只需3小时!飞算JavaAI引爆全民编程革命:不懂代码也能做系统,AI全自动开发时代来了!

目录 一、我是个“编程小白”,但我也有梦想 二、飞算AI到底是什么?一句话说清楚 类比理解: 三、飞算JavaAI的核心功能(小白也能听懂) 1. 智能引导 2. JavaChat 3. 智能问答 4. SQL Chat 5. 编程智能体 四、我的真实体验:从“0”到“上线”只要3小时  注册和登录 使用:  个人感受: 五、飞算AI vs 国内外主流AI编程工具(详细对比) 详细对比分析 1. 功能定位不同 2. 对小白的友好度 3. 生成代码的质量 4. 部署能力 5. 技术栈支持 六、

By Ne0inhk
66个JAVA常见代码大全:学完这篇从Java小白到AI全栈架构师

66个JAVA常见代码大全:学完这篇从Java小白到AI全栈架构师

66个JAVA常见代码大全:学完这篇从Java小白到AI全栈架构师 摘要:本文详细列举了 66 个 Java 编程中的关键代码示例,包括基础语法、数据类型、条件判断、循环、数组、方法、面向对象、继承、接口、抽象类、多态、封装、静态变量、内部类、匿名类、泛型、集合框架、异常处理、文件 I/O、多线程、同步以及高级并发概念,帮助你从入门到成长为架构师。 66个Java常见代码大全:学完这篇从Java小白到AI全栈架构师 引言 在当今的编程世界中,Java 作为一种广泛使用的编程语言,涵盖了从基础语法到复杂架构的方方面面。无论是刚接触编程的新手,还是经验丰富的开发者,掌握Java的核心技术和常用模式,都是成为一名高效开发者的必经之路。本篇文章将带您通过 66 个关键代码示例,从零开始深入学习 Java,从最基础的语法到高阶的并发编程,帮助您成为一名合格的

By Ne0inhk
JDK的下载与安装教程(详细版,下载地址:官网+其它镜像)

JDK的下载与安装教程(详细版,下载地址:官网+其它镜像)

目录 1、JDK官网 2、基于JDK官网下载JDK版本 3、基于其它镜像的下载JDK版本  3.1 使用华为镜像 3.2 使用injdk镜像 4、JDK的安装 5、配置JDK的环境变量 6、ideal选择相应的JDK版本 6.1 新建项目(new project) 6.2 创建项目后,调整JDK版本 6.3通过Maven依赖来控制JDK的版本 1、JDK官网 官网地址:Java Downloads | Oracle 中国https://www.oracle.com/cn/java/technologies/downloads/#jdk17-windows 官网地址(jdk17版本之前的):https://www.oracle.

By Ne0inhk
华为OD机试双机位C卷 - 部门人力分配 (C++ & Python & JAVA & JS & GO)

华为OD机试双机位C卷 - 部门人力分配 (C++ & Python & JAVA & JS & GO)

部门人力分配 华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解 题目描述 部门在进行需求开发时需要进行人力安排。 当前部门需要完成 N 个需求,需求用 requirements 表述,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。 这部分需求需要在 M 个月内完成开发,进行人力安排后每个月人力时固定的。 目前要求每个月最多有2个需求开发,并且每个月需要完成的需求不能超过部门人力。 请帮助部门评估在满足需求开发进度的情况下,每个月需要的最小人力是多少? 输入描述 输入为 M 和 requirements,M 表示需求开发时间要求,requirements 表示每个需求工作量大小,N 为 requirements长度, * 1 ≤ N/2 ≤ M ≤ N ≤ 10000

By Ne0inhk