广告
返回顶部
首页 > 资讯 > 精选 >Java中二叉树的基础概念是什么
  • 621
分享到

Java中二叉树的基础概念是什么

2023-06-29 13:06:43 621人浏览 八月长安
摘要

这篇文章主要讲解了“Java中二叉树的基础概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中二叉树的基础概念是什么”吧!1. 树型结构1.1概念树是一种 非线性 的数据结构,

这篇文章主要讲解了“Java中二叉树的基础概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中二叉树的基础概念是什么”吧!

    1. 树型结构

    1.1概念

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

    Java中二叉树的基础概念是什么

    1.2 概念(重要)

    a.节点的度:该节点子树的个数;如上图:A的度为6,J的度为2

    b.树的度:该树中,最大结点的度就是该数的度;如上图:树的度为6

    c.叶子节点(终端节点):度为0的节点(没有子树的节点)

    d.双亲结点/父节点:如上图:D是H的父节点

    孩子节点/子节点:如上图:H是D的子节点

    e.根节点:没有双亲的节点;如上图:A

    f.节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;

    g.树的高度或深度:树中节点的最大层次; 如上图:树的高度为4

    2. 二叉树(重点)

    2.1 概念

    每个节点最多只有两颗子树,度<=2.

    2.2 二叉树的基本形态

    Java中二叉树的基础概念是什么

    2.3 两种特殊的二叉树

    Java中二叉树的基础概念是什么

    a.满二叉树:非子叶度都为2

    b.完全二叉树:满二叉树缺了“右下角”

    2.4 二叉树的性质

    a.满二叉树

    高度为K,则有2^k-1个节点

    层次为K,则该层有2^(k-1)个节点

    边个数 = 节点个数 - 1

    度为0有n0个,度为2有n2个,则 n0 = n2 + 1

    b.完全二叉树

    有右孩子必有左孩子

    只可能有一个度为1的节点

    2.5 二叉树的存储

    二叉树的存储结构分为:顺序存储和类似于链表的链式存储。

    顺序存储:只能存完全二叉树

    链式存储:普通二叉树

    本次展示链式存储

    二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有二叉和三叉表示方式 ,

    Java中二叉树的基础概念是什么

    以此图为例, 具体如下:

    // 孩子表示法private static class Treenode{    char val;    TreeNode left;    TreeNode right;     public TreeNode(char val) {        this.val = val;    }}

    初始化:

        public static TreeNode build(){        TreeNode nodeA=new TreeNode('A');        TreeNode nodeB=new TreeNode('B');        TreeNode nodeC=new TreeNode('C');        TreeNode nodeD=new TreeNode('D');        TreeNode nodeE=new TreeNode('E');        TreeNode nodeF=new TreeNode('F');        TreeNode nodeG=new TreeNode('G');        TreeNode nodeH=new TreeNode('H');        nodeA.left=nodeB;        nodeA.right=nodeC;        nodeB.left=nodeD;        nodeB.right=nodeE;        nodeE.right=nodeH;        nodeC.left=nodeF;        nodeC.right=nodeG;        return nodeA;    }

    2.6 二叉树的基本操作

    1 二叉树的遍历 (递归)

    NLR :前序遍历 (Preorder Traversal 亦称先序遍历 )&mdash;&mdash; 访问根结点 ---> 根的左子树 ---> 根的右子树。

        //先序遍历 : 根左右    public static void preOrder(TreeNode root){        if(root==null){            return;        }        System.out.print(root.val+" ");        preOrder(root.left);        preOrder(root.right);    }

    LNR :中序遍历 (Inorder Traversal)&mdash;&mdash; 根的左子树 ---> 根节点 ---> 根的右子树。

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

    LRN :后序遍历 (Postorder Traversal)&mdash;&mdash; 根的左子树 ---> 根的右子树 ---> 根节点。

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

    2 二叉树的遍历 (迭代)

    前序遍历

        //方法2(迭代)    //先序遍历 (迭代)    public static void preOrderNonRecursion(TreeNode root){        if(root==null){            return ;        }        Deque<TreeNode> stack=new LinkedList<>();        stack.push(root);        while (!stack.isEmpty()){            TreeNode cur=stack.pop();            System.out.print(cur.val+" ");            if(cur.right!=null){                stack.push(cur.right);            }            if(cur.left!=null){                stack.push(cur.left);            }        }    }

    中序遍历

        //方法2(迭代)    //中序遍历 (迭代)    public static void inorderTraversalNonRecursion(TreeNode root) {        if(root==null){            return ;        }         Deque<TreeNode> stack=new LinkedList<>();        // 当前走到的节点        TreeNode cur=root;        while (!stack.isEmpty() || cur!=null){            // 不管三七二十一,先一路向左走到根儿~            while (cur!=null){                stack.push(cur);                cur=cur.left;            }            // 此时cur为空,说明走到了null,此时栈顶就存放了左树为空的节点            cur=stack.pop();            System.out.print(cur.val+" ");            // 继续访问右子树            cur=cur.right;        }    }

    后序遍历

        //方法2(迭代)    //后序遍历 (迭代)    public static void postOrderNonRecursion(TreeNode root){        if(root==null){            return;        }        Deque<TreeNode> stack=new LinkedList<>();        TreeNode cur=root;        TreeNode prev=null;         while (!stack.isEmpty() || cur!=null){            while (cur!=null){                stack.push(cur);                cur=cur.left;            }             cur=stack.pop();            if(cur.right==null || prev==cur.right){                System.out.print(cur.val+" ");                prev=cur;                cur=null;            }else {                stack.push(cur);                cur=cur.right;            }        }    }

    3 二叉树的基本操作

    求结点个数(递归&迭代)

        //方法1(递归)    //传入一颗二叉树的根节点,就能统计出当前二叉树中一共有多少个节点,返回节点数    //此时的访问就不再是输出节点值,而是计数器 + 1操作    public static int getNodes(TreeNode root){        if(root==null){            return 0;        }        return 1+getNodes(root.left)+getNodes(root.right);    }     //方法2(迭代)    //使用层序遍历来统计当前树中的节点个数    public static int getNodesNoRecursion(TreeNode root){        if(root==null){            return 0;        }        int size=0;        Deque<TreeNode> queue=new LinkedList<>();        queue.offer(root);        while (!queue.isEmpty()) {            TreeNode cur = queue.poll();            size++;            if (cur.left != null) {                queue.offer(cur.left);            }            if (cur.right != null) {                queue.offer(cur.right);            }        }        return size;    }

    求叶子结点个数(递归&迭代)

        //方法1(递归)    //传入一颗二叉树的根节点,就能统计出当前二叉树的叶子结点个数    public static int getLeafNodes(TreeNode root){        if(root==null){            return 0;        }        if(root.left==null && root.right==null){            return 1;        }        return getLeafNodes(root.left)+getLeafNodes(root.right);    }     //方法2(迭代)    //使用层序遍历来统计叶子结点的个数    public static int getLeafNodesNoRecursion(TreeNode root){        if(root==null){            return 0;        }        int size=0;        Deque<TreeNode> queue=new LinkedList<>();        queue.offer(root);        while (!queue.isEmpty()){            TreeNode cur=queue.poll();            if(cur.left==null && cur.right==null){                size++;            }            if(cur.left!=null){                queue.offer(cur.left);            }            if(cur.right!=null){                queue.offer(cur.right);            }        }        return size;    }

    求第 k 层结点个数

        //求出以root为根节点的二叉树第k层的节点个数    public static int getKLevelNodes(TreeNode root,int k){        if(root==null || k<=0){            return 0;        }        if(k==1){            return 1;        }        return getKLevelNodes(root.left,k-1)+getKLevelNodes(root.right,k-1);    }

    求树的高度

        //传入一个以root为根节点的二叉树,就能求出该树的高度    public static int height(TreeNode root){        if(root==null){            return 0;        }        return 1+ Math.max(height(root.left),height(root.right));    }

    判断二叉树数中是否存在值为value的节点

        //判断当前以root为根节点的二叉树中是否包含指定元素val,    //若存在返回true,不存在返回false    public static boolean contains(TreeNode root,char value){        if(root==null){            return false;        }        if(root.val==value){            return true;        }        return contains(root.left,value) || contains(root.right,value);    }

    2.7 二叉树的层序遍历

        //层序遍历    public static void levelOrder(TreeNode root) {        if(root==null){            return ;        }         // 借助队列来实现遍历过程        Deque<TreeNode> queue =new LinkedList<>();        queue.offer(root);        while (!queue.isEmpty()){            int size=queue.size();            for (int i = 0; i < size; i++) {                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/325027.html(转载时请注明来源链接)

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

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

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

    下载Word文档
    猜你喜欢
    • Java中二叉树的基础概念是什么
      这篇文章主要讲解了“Java中二叉树的基础概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中二叉树的基础概念是什么”吧!1. 树型结构1.1概念树是一种 非线性 的数据结构,...
      99+
      2023-06-29
    • 详解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中关于二叉树的概念以及搜索二叉树详解
      目录一、二叉树的概念为什么要使用二叉树?树是什么?树的相关术语!根节点路径父节点子节点叶节点子树访问层(深度)关键字满二叉树完全二叉树二叉树的五大性质二、搜索二叉树插入删除hello...
      99+
      2022-11-12
    • C语言二叉树的概念是什么及怎么使用
      本篇内容主要讲解“C语言二叉树的概念是什么及怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言二叉树的概念是什么及怎么使用”吧!1.二叉树的概念及结构 ①概念:一棵二叉树是结...
      99+
      2023-06-29
    • Java基础之二叉搜索树的基本操作
      目录一、二叉搜索树插入元素二、搜索指定节点三、删除节点方式一四、删除节点方式二五、运行结果一、二叉搜索树插入元素 class Node { int v...
      99+
      2022-11-12
    • C语言中关于树和二叉树的相关概念
      目录一、树树的相关概念树的存储结构二、二叉树二叉树的性质树是一种 非线性的 数据结构,由 n(n >= 0) 个 有限节点 组成一种 具有层次关系 的集合 一、树 树的结构可以...
      99+
      2023-02-14
      C语言树和二叉树的概念 C语言树和二叉树
    • Java多线程基础概念是什么
      本篇内容主要讲解“Java多线程基础概念是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java多线程基础概念是什么”吧!并发与并行并行,表示两个线程同时做事情。并发,表示一会做这个事情,一...
      99+
      2023-06-17
    • C++基础概念是什么
      这篇文章主要讲解了“C++基础概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++基础概念是什么”吧!首先,通过一张最新(2021.11)的编程语言排名图来了解常见的编程语言:从图...
      99+
      2023-06-22
    • cornerstone Tools基础概念是什么
      这篇文章主要介绍“cornerstone Tools基础概念是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“cornerstone Tools基础概念是什么”文章能帮助大家解...
      99+
      2023-07-05
    • C++ void的基础概念是什么
      本篇文章为大家展示了C++ void的基础概念是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C++编程语言中的很多概念都值得我们去不断的学习,不断的从中积累经验以帮助我们在程序编写时获得更大的...
      99+
      2023-06-17
    • C++继承基础概念是什么
      C++继承基础概念是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C++编程语言同样也具有面向对象的相关特性。那么它都具有哪些特点呢?在这里我们就为大家详细...
      99+
      2023-06-17
    • Java中平衡二叉树的原理是什么
      Java中平衡二叉树的原理是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、平衡二叉树的定义平衡二叉树是一种二叉排序树,其中每一个节点的左子树和右子树的高...
      99+
      2023-06-15
    • JAVA基本概念是什么
      这篇文章主要为大家展示了“JAVA基本概念是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JAVA基本概念是什么”这篇文章吧。一、java发展史1.java之父:詹姆斯·高家林2.关键时间点...
      99+
      2023-06-25
    • ecs云服务器的基础概念是什么
      云服务器的基础概念是分布式计算。通过将计算任务分配给多个计算实例,云服务器可以实现高效的资源分配和负载均衡,以确保每个实例都能够以最高的效率运行。这种分布式计算的优势在于,可以提高计算能力和响应速度,同时减少了系统崩溃和网络中断的风险。 ...
      99+
      2023-10-28
      概念 服务器 基础
    • ASP.NET缓存机制基础概念是什么
      这篇文章主要讲解了“ASP.NET缓存机制基础概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ASP.NET缓存机制基础概念是什么”吧!ASP.NET缓存机制名词解释页输出缓存:保存...
      99+
      2023-06-18
    • Java实现二叉树的遍历方法是什么
      本篇内容主要讲解“Java实现二叉树的遍历方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java实现二叉树的遍历方法是什么”吧!遍历二叉树遍历或称周游,traversal。系统地访问数...
      99+
      2023-06-19
    • C#零基础开发中最重要的概念是什么
      本篇内容主要讲解“C#零基础开发中最重要的概念是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#零基础开发中最重要的概念是什么”吧!初步学习C#自然推荐使用宇宙最强IDE Visual S...
      99+
      2023-07-05
    • C++ LeeCode二叉树的中序遍历是什么
      这篇文章主要介绍了C++ LeeCode二叉树的中序遍历是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++ LeeCode二叉树的中序遍历是什么文章都会有所收获,下面我们一起来看看吧。一、题目二、代码c...
      99+
      2023-06-19
    • Java二叉树的构造和遍历方法是什么
      今天小编给大家分享一下Java二叉树的构造和遍历方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。题目一 解...
      99+
      2023-06-29
    • java四则运算和二叉树的关系是什么
      今天小编给大家分享一下java四则运算和二叉树的关系是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。引言前几天忽然想到了...
      99+
      2023-07-05
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作