广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java实现二叉树的基本操作详解
  • 782
分享到

Java实现二叉树的基本操作详解

Java二叉树操作Java二叉树 2022-11-13 18:11:47 782人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录1. 二叉树结点的构成2. 二叉树的遍历2.1 前序遍历2.2 中序遍历2.3 后序遍历3. 获取整棵二叉树的节点个数4. 获取二叉树叶子节点的个数5. 获取第K层节点的个数6.

1. 二叉树结点的构成

这里采用的是孩子表示法, 所以节点类(使用的是静态内部类)中除了数值域外要有两个引用来表示节点的左子树和右子树.

static class Treenode {
        public char val;//数值
        public TreeNode left;//左子树引用
        public TreeNode right;//右子树引用

        public TreeNode(char val) {
            this.val = val;
        }
    }

2. 二叉树的遍历

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

其实不管是前序遍历,中序遍历,还是后续遍历,二叉树的遍历所走的路径都是相同的,三者之间的区别只是获取根节点数据的时机不同。

2.1 前序遍历

前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点—>根的左子树—>根的右子树。

我们利用递归解决问题的思想, 可以将一个问题拆解为子问题去解决, 也就是实现下面的过程:

  • 访问根节点数据;
  • 前序遍历左子树;
  • 前序遍历右子树;

递归结束条件:如果结点root为空,则返回。

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

2.2 中序遍历

中序遍历(Inorder Traversal)——根的左子树—>根节点—>根的右子树;

和上面的实现思想相同, 只是访问根节点的时机不同;

  • 中序遍历左子树;
  • 访问根节点数据;
  • 中序遍历右子树;

递归结束条件:如果结点root为空,则返回。

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

2.3 后序遍历

同样的, 实现过程如下,

  • 后序遍历左子树;
  • 后序遍历右子树;
  • 访问根结点数据;

递归结束条件:如果结点root为空,则返回。

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

3. 获取整棵二叉树的节点个数

获取树中的节点个数, 最容易想到的就是遍历一遍树, 通过计数实现了, 代码写起来也不难;

也可以通过递归解决子问题的思想来实现 , 本质上还是在遍历二叉树

节点的个数等于根节点(1) + 左子树节点个数 + 右子树节点个数 ,

递归结束条件: 如果结点root为空,则返回。

    //获取树中节点的个数,遍历计数法
    public static int nodeSize;
    public int size(TreeNode root) {
        //先将nodeSzie置为0
        nodeSize = 0;
        sizefunc(root);
        return nodeSize;
    }
    public void sizefunc(TreeNode root) {
        if(root == null) {
            return;
        }
        nodeSize++;
        sizefunc(root.left);
        sizefunc(root.right);
    }

    //获取树中节点的个数,子问题思想
    public int size2(TreeNode root) {
        if(root == null) {
            return 0;
        }
        return size2(root.left) + size2(root.right) + 1;
    }

4. 获取二叉树叶子节点的个数

同样的思考的话和上面一样, 可以采用计数和子问题来实现, 不过本质上是差不多的;

递归思路:

  • 如果结点为空,表示该树没有结点返回0,
  • 如果结点的左右子树都为空,表示该结点为叶子结点,计算器+1或者返回1。
  • 一棵二叉树的叶子结点数为左右子树叶子结点数之和。
    //获取叶子节点的个数,子问题思想
    public int getLeafNodeCount(TreeNode root){
        if(root == null) {
            return 0;
        }
        if(root.left == null && root.right == null) {
            return 1;
        }
        return getLeafNodeCount(root.left) + getLeafNodeCount(root.right);
    }
    //获取叶子节点的个数,遍历计数法
    public static int leafSize;
    public int getLeafNodeCount2(TreeNode root){
        leafSize = 0;
        getLeafNodeCount2func(root);
        return leafSize;
    }
    public void getLeafNodeCount2func(TreeNode root) {
        if(root == null) {
            return;
        }
        if(root.left == null && root.right == null) {
            leafSize++;
        }
        getLeafNodeCount2func(root.left);
        getLeafNodeCount2func(root.right);
    }

5. 获取第K层节点的个数

递归思路:

  • 如果结点为空,返回0,k为1,返回1。
  • 一棵二叉树第k层结点数为 左子树和右子树第k-1层次的结点数之和。

当k=1时,表示第一层次的结点个数,结点个数为1,每递归一层,从根节点来说是第k层, 那么相对于根节点的子树来说就是k-1层,所以一棵二叉树第k层结点数为左子树,右子树第k-1层次的结点数之和。

public int getKLevelNodeCount(TreeNode root, int k) {
        if(root == null || k <= 0) {
            return 0;
        }
        if(k == 1) {
            return 1;
        }
        return getKLevelNodeCount(root.left, k-1) + getKLevelNodeCount(root.right, k-1);
    }

6. 获取二叉树的高度(深度)

递归思路:

如果根结点为空,则这棵树的高度为0,返回0。

一棵二叉树的最深深度即为左右子树深度的最大值加上1。

// 获取二叉树的高度
    public int getHeight(TreeNode root) {
        if(root == null) {
            return 0;
        }
        int leftHight = getHeight(root.left);
        int rightHight = getHeight(root.right);
        return leftHight>rightHight ? leftHight+1 : rightHight+1;
    }

7. 在二叉树中寻找目标值

通过遍历去搜索比较即可, 前中后序遍历都可以.

//检测值为val的元素是否存在
    public boolean find(TreeNode root, char val) {
        if(root == null) {
            return false;
        }
        if(root.val == val) {
            return true;
        }
        boolean ret1 = find(root.left, val);
        if(ret1){
            return true;
        }
        boolean ret2 = find(root.right, val);
        if(ret2){
            return true;
        }
        return false;
    }

8. 判断二叉树是不是完全二叉树

判断一棵树是不是完全二叉树,我们可以设计一个队列来实现,

完全二叉树按照从上至下, 从左到右的顺序节点之间是连续着没有空位置的, 这里如果有不了解的可以看一看二叉树概念篇的博客; 如果一颗二叉树不是完全二叉树 , 那么树中的节点之间是有空着的位置的(null); 只要找到这个位置, 后面再没有节点了就是完全二叉树; 如果空位置后面还有节点就不是完全二叉树;

我们可以设计一个队列来实现, 首先将根节点入队,然后循环每次将队头元素出队同时将出队节点的左右孩子结点(包括空结点)依次入队,以此类推,直到获取的结点为空(就是上面说的空位置),此时判断队列中的所有元素是否为空,如果为空,就表示这棵二叉树为完全二叉树 ; 否则就不是完全二叉树.

//判断一棵树是不是完全二叉树
    public boolean isCompleteTree(TreeNode root) {
        if(root == null) {
            return true;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()) {
            TreeNode cur = queue.poll();
            if(cur == null) {
                break;
            }
            queue.offer(cur.left);
            queue.offer(cur.right);
        }
        //判断队列中是否有不为空的元素
        int size = queue.size();
        while(size != 0) {
            size--;
            if(queue.poll() != null) {
                return false;
            }
        }
        return true;
    }

9. 层序遍历

层序遍历的实现方式与判断一棵二叉树是否是完全二叉树类似,都是使用队列来进行实现,只有一点不同, 入队时如果结点为空,则不需要入队,其他的地方完全相同, 出队时获取到节点中的元素, 直到最终队列和当前结点均为空时,表示遍历结束。

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

到此这篇关于Java实现二叉树的基本操作详解的文章就介绍到这了,更多相关Java二叉树内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java实现二叉树的基本操作详解

本文链接: https://www.lsjlt.com/news/169834.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java实现二叉树的基本操作详解
    目录1. 二叉树结点的构成2. 二叉树的遍历2.1 前序遍历2.2 中序遍历2.3 后序遍历3. 获取整棵二叉树的节点个数4. 获取二叉树叶子节点的个数5. 获取第K层节点的个数6....
    99+
    2022-11-13
    Java二叉树操作 Java二叉树
  • JAVA二叉树的基本操作
    目录记录二叉树的基本操作DEMO1、创建一个二叉树类2、然后创建二叉树的节点记录二叉树的基本操作DEMO 1、创建一个二叉树类 这里约束了泛型只能为实现了Comparable这个接口的类型。 public class BinaryT...
    99+
    2021-12-08
    JAVA二叉树的操作 JAVA二叉树
  • Java基础之二叉搜索树的基本操作
    目录一、二叉搜索树插入元素二、搜索指定节点三、删除节点方式一四、删除节点方式二五、运行结果一、二叉搜索树插入元素 class Node { int v...
    99+
    2022-11-12
  • C语言实现BST二叉排序树的基本操作
    本文实例为大家分享了C语言实现BST二叉排序树的基本操作代码,供大家参考,具体内容如下 BST-二叉排序树的几个基本操作。 头文件声明与函数定义 #include <std...
    99+
    2022-11-12
  • 详解Java 二叉树的实现和遍历
    目录什么是二叉树二叉树建树前序建树中序建树后序建树二叉树的遍历什么是二叉树 简单理解为对于一个节点来说,最多拥有一个上级节点,同时最多具备左右两个下级节点的数据结构。 由于很多排序算...
    99+
    2022-11-13
  • java基础二叉搜索树图文详解
    目录概念直接实践准备工作:定义一个树节点的类,和二叉搜索树的类。搜索二叉树的查找功能搜索二叉树的插入操作搜索二叉树 删除节点的操作 - 难点性能分析总程序 - 模拟实现二叉搜索树和 ...
    99+
    2022-11-13
  • JavaScript二叉搜索树构建操作详解
    目录前言什么是二叉搜索树构建一颗二叉搜索树二叉搜索树的操作向二叉搜索树中插入数据查找二叉搜索树中的数据删除二叉搜索树的某个节点前驱后继节点删除一个节点的三种情况实现代码完整代码总结前...
    99+
    2022-11-13
  • Java实现二叉查找树的增删查详解
    目录定义增加节点查询节点删除节点定义 二叉查找树(ADT)是一个具有对于树种的某个节点X,它的左节点都比X小,它的右节点都比X大的二叉树。如下就是一个符合 要求的二叉查找树: 增加...
    99+
    2022-11-13
  • 关于Java的二叉树、红黑树、B+树详解
    目录1、二叉查找树2、平衡二叉查找树3、红黑树:4、 B树:5、 B+树6、红黑树 VS B+树数组和链表是常用的数据结构,数组虽然查找快(有序数组可以通过二分法查找),但是插入和删...
    99+
    2023-05-20
    Java二叉树 Java红黑树 JavaB+树
  • Java中关于二叉树的概念以及搜索二叉树详解
    目录一、二叉树的概念为什么要使用二叉树?树是什么?树的相关术语!根节点路径父节点子节点叶节点子树访问层(深度)关键字满二叉树完全二叉树二叉树的五大性质二、搜索二叉树插入删除hello...
    99+
    2022-11-12
  • 纯C++代码详解二叉树相关操作
    目录前言 二叉树的概念二叉树的相关术语相关操作菜单二叉树的构造创建二叉树先序遍历二叉树  中序遍历二叉树后序遍历二叉树层次遍历二叉树二叉树的深度二叉树的叶子结点数...
    99+
    2022-11-13
  • Python实现二叉树结构与进行二叉树遍历的方法详解
    二叉树的建立 使用类的形式定义二叉树,可读性更好 class BinaryTree: def __init__(self, root): self.key = root sel...
    99+
    2022-06-04
    二叉树 遍历 详解
  • C++ 二叉树的实现超详细解析
    目录1、树的概念及结构(了解)1.1树的概念:1.2树的表示法:2、二叉树的概念及结构2.1二叉树的概念:2.2特殊的二叉树:2.3二叉树的性质:2.4二叉树的顺序存储:2.5二叉树...
    99+
    2022-11-13
  • java二叉树的遍历方式详解
    目录一、前序遍历(递归和非递归)二、中序遍历(递归和非递归)三、后序遍历(递归和非递归)四、层序遍历总结一、前序遍历(递归和非递归) 前序遍历就是先遍历根再遍历左之后是右 根左右 ...
    99+
    2022-11-12
  • Java实现多叉树和二叉树之间的互转
    目录前言正文思路分析代码实现总结前言 本文主要介绍如何把一个多叉树转换成二叉树以及把二叉树还原成多叉树。 正文 给出一个多叉树,实现一个函数,这个函数可以把多叉树转成二叉树,再实现一...
    99+
    2023-05-19
    Java 多叉树和二叉树互转 Java 多叉树和二叉树互转
  • 详解Java中二叉树的基础概念(递归&迭代)
    目录1.树型结构1.1概念1.2概念(重要)2.二叉树(重点)2.1概念2.2二叉树的基本形态2.3两种特殊的二叉树2.4二叉树的性质2.5二叉树的存储2.6二叉树的基本操作2.7二...
    99+
    2022-11-13
  • Java实现红黑树(平衡二叉树)的详细过程
    目录前言红黑二叉查找树2-3树2-3树的插入操作实现红黑二叉树结尾前言 在实现红黑树之前,我们先来了解一下符号表。 符号表的描述借鉴了Algorithms第四版,详情在:https...
    99+
    2022-11-12
  • Java数据结构之平衡二叉树的实现详解
    目录定义结点结构查找算法插入算法LL 型RR 型LR 型RL 型插入方法删除算法概述实例分析代码完整代码定义 动机:二叉查找树的操作实践复杂度由树高度决定,所以希望控制树高,左右子...
    99+
    2022-11-13
  • 详解mysql基本操作详细(二)
    前言 本文类容 1、数据库的几大约束 2、表与表之间的关系 约束: 主键约束: 作用:为了保证数据的有效性和完整性 mysql中常用的约束:主键约束(primary key) 唯一约束(unique) ...
    99+
    2022-10-18
  • Python学习之二叉树实现的示例详解
    Python实现二叉树 Python实现二叉树可以使用面向对象编程的方式,通过定义二叉树节点类来实现。每个节点包含一个数据元素、左右子节点指针和一些操作方法,如插入节点、查找节点、...
    99+
    2023-05-15
    Python实现二叉树 Python二叉树
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作