数据结构(Java)——二叉树

news/2025/1/31 2:23:56/

1.概念

       二叉树是一种树形数据结构,其中每个节点最多有两个子节点,通常被称为左子节点和右子节点。二叉树可以是空的(即没有节点),或者由一个根节点以及零个或多个左子树和右子树组成,其中左子树和右子树也分别是二叉树。

2. 基本术语

  • 根节点(Root):树的起始节点。
  • 子节点(Children):每个节点可以有零个、一个或两个子节点,分别称为左子节点和右子节点。
  • 父节点(Parent):一个节点的直接上层节点。
  • 兄弟节点(Siblings):具有相同父节点的节点。
  • 叶子节点(Leaf Nodes):没有子节点的节点。
  • 内部节点(Internal Nodes):非叶子节点,即至少有一个子节点的节点。
  • 深度(Depth):从根节点到某个节点的最长路径上的边数。
  • 高度(Height):从某个节点到其最远叶子节点的最长路径上的边数。根节点的高度是整个树的高度。

3. 类型

  1. 满二叉树(Full Binary Tree):每个节点要么是叶子节点,要么恰好有两个子节点。
  2. 完全二叉树(Complete Binary Tree):除了最后一层外,每一层都是满的,并且最后一层的节点都靠左对齐。
  3. 平衡二叉树(Balanced Binary Tree):一个二叉树的每个节点的两个子树的高度差不会超过1。
  4. 搜索二叉树(Binary Search Tree, BST):每个节点的值都大于其左子树所有节点的值,小于其右子树所有节点的值。

4. 操作

4.1 构建二叉树

代码示例

java">static class TreeNode{public char val;public TreeNode left;public TreeNode right;public TreeNode(char val) {this.val = val;}}public TreeNode createBinaryTree(){TreeNode A = new TreeNode('A');TreeNode B = new TreeNode('B');TreeNode C = new TreeNode('C');TreeNode D = new TreeNode('D');TreeNode E = new TreeNode('E');TreeNode F = new TreeNode('F');TreeNode G = new TreeNode('G');A.left = B;A.right = C;B.left = D;B.right = E;C.left = F;C.right = G;return A;}

4.2 遍历

4.2.1 前序遍历

原理:根节点 -> 左子树 -> 右子树(根左右)

代码示例: 

java">    //前序排列public void preOrder(TreeNode root){if(root == null){return ;}System.out.print(root.val + " ");preOrder(root.left);preOrder(root.right);}

运行结果如下:

4.2.2 中序遍历

原理:左子树 -> 根节点 -> 右子树(左根右)

代码示例: 

java">    // 中序遍历public void inOrder(TreeNode root){if(root == null){return ;}inOrder(root.left);System.out.print(root.val + " ");inOrder(root.right);}

运行结果如下:

4.2.3 后序遍历

原理:左子树 -> 右子树 -> 根节点(左右根) 

代码示例

java">    // 后序遍历public void postOrder(TreeNode root){if(root == null){return ;}postOrder(root.left);postOrder(root.right);System.out.print(root.val + " ");}

运行结果如下:

4.2.4 层序遍历

原理:按层次从上到下、从左到右遍历节点。

代码示例:

java">   //层序遍历public  void levelOrder(TreeNode root){if(root == null)return;Queue<TreeNode> queue = new LinkedList<TreeNode>();queue.add(root);while(!queue.isEmpty()){TreeNode node=  queue.poll();System.out.print(node.val+" ");if(temp.left != null)queue.add(node.left);if(temp.right != null)queue.add(node.right);}}

运行结果如下:

4.3 其他方法

代码示例:

java">    // 获取树中节点的个数public int size(TreeNode root){if(root == null){return 0;}return size(root.left) + size(root.right) + 1;}// 获取叶子节点的个数int getLeafNodeCount(TreeNode root){if(root == null){return 0;}if(root.right == null&&root.left == null){return 1;}return  getLeafNodeCount(root.left) + getLeafNodeCount(root.right);}// 获取第K层节点的个数public int getKLevelNodeCount(TreeNode root,int k){if(root == null){return 0;}if(k == 1){return 1;}return getKLevelNodeCount(root.left,k - 1)+ getKLevelNodeCount(root.right,k -1);}// 获取二叉树的高度public int getHeight(TreeNode root){if(root == null){return 0;}int leftHeight = getHeight(root.left);int rightHeight = getHeight(root.right);return leftHeight > rightHeight?leftHeight + 1:rightHeight+1;}// 检测值为value的元素是否存在public TreeNode find(TreeNode root, char val){if(root == null){return null;}if(root.val == val){return root;}TreeNode ret = find(root.left,val);if(ret!= null){return ret;}ret  = find(root.right,val);if(ret!= null){return ret;}return null;}

运行结果如下:

本文是作者学习后的总结,如果有什么不恰当的地方,欢迎大佬指正!!!


http://www.ppmy.cn/news/1568035.html

相关文章

LM Studio 本地部署DeepSeek及其他AI模型的详细操作教程及硬件要求

本篇文章主要讲解&#xff0c;通过LM Studio工具实现各类型AI模型本地部署的操作方法方式。 作者&#xff1a;任聪聪 日期&#xff1a;2025年1月29日 LM Studio 介绍&#xff1a; LM Studio是一款能够本地离线运行各类型大语言模型的客户端应用&#xff0c;通过LM Studio 可以…

http和ws的区别

一. 连接建立 1.HTTP&#xff1a; &#xff08;1&#xff09;使用TCP协议建立连接 &#xff08;2&#xff09;每次请求都是独立的&#xff0c;即使是同一用户的连续请求&#xff0c;也会重复建立和断开连接&#xff08;除非使用了HTTP/2或持久连接&#xff09; &#xff08…

【后端开发】字节跳动青训营Cloudwego脚手架

Cloudwego脚手架使用 cwgo脚手架 cwgo脚手架 安装的命令&#xff1a; GOPROXYhttps://goproxy.cn/,direct go install github.com/cloudwego/cwgolatest依赖thriftgo的安装&#xff1a; go install github.com/cloudwego/thriftgolatest编辑echo.thrift文件用于生成项目&…

蓝桥杯python语言基础(1)——编程基础

目录 一、python开发环境 二、python输入输出 &#xff08;1&#xff09;print输出函数 print(*object&#xff0c;sep,end\n,......) &#xff08;2&#xff09;input输入函数 input([prompt]), 输入的变量均为str字符串类型&#xff01; input()会读入一整行的信息 ​编…

selenium定位网页元素

1、概述 在使用 Selenium 进行自动化测试时&#xff0c;定位网页元素是核心功能之一。Selenium 提供了多种定位方法&#xff0c;每种方法都有其适用场景和特点。以下是通过 id、linkText、partialLinkText、name、tagName、xpath、className 和 cssSelector 定位元素的…

MySQL 9.2.0 的功能

MySQL 9.2.0 的功能 MySQL 9.2.0 的功能新增、弃用和删除内容如下&#xff1a; 新增功能 权限新增12&#xff1a;引入了CREATE_SPATIAL_REFERENCE_SYSTEM权限&#xff0c;拥有该权限的用户可执行CREATE SPATIAL REFERENCE SYSTEM、CREATE OR REPLACE SPATIAL REFERENCE SYSTEM…

Kotlin泛型学习篇

泛型: in、out、where Kotlin 中的类可以有类型参数&#xff0c;与 Java 类似&#xff1a; class Box<T>(t: T) {var value t }创建这样类的实例只需提供类型参数即可&#xff1a; val box: Box<Int> Box<Int>(1)但是如果类型参数可以推断出来&#xff…

2.3.1 基本数据类型

ST&#xff08;Structured Text&#xff09;语言支持多种基本数据类型&#xff0c;用于定义变量、常量以及函数参数等。这些数据类型涵盖了布尔值、整数、浮点数、字符和字符串等常见类型。以下是ST语言中基本数据类型的详细说明&#xff1a; 布尔类型&#xff08;BOOL&#xf…