首页 > 编程语言 >【Java--数据结构】二叉树

【Java--数据结构】二叉树

时间:2024-07-16 22:25:59浏览次数:13  
标签:TreeNode -- public return 二叉树 Java null root 节点

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



树结构

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合

注意:树形结构中,子树之间不能有交集,否则就不是树形结构

常见概念 

 节点的度:一个节点含有子树的个数,如A的度为6

树的度:一颗树所有节点的度的最大值,如上图中树的度为6

叶子节点(终端节点):度为0的节点,如P,Q节点

父节点(双亲节点):有子节点的节点,如A是B的父节点

子节点(孩子节点):与父节点相反,如B是A的子节点

根节点:没有父节点的节点,如A

节点的层次:从根节点为第1层 ,往下数,以此类推。

树的高度:树的最大层次数,如上图树的高度为4

树的应用

 二叉树

一棵二叉树是结点的一个有限集合,该集合: 为空或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成

 注意:每个节点最多有两颗子树,且有左右之分。

 二叉树的各种情况

满二叉树 与 完全二叉树

满二叉树:每层的节点都达到最大值。(若满二叉树的层数为k,则节点个数为2^K-1)

完全二叉树:每一层从左到右数,直到最后一个节点的前面必须是满的。(满二叉树是特殊的完全二叉树)

二叉树的性质:

前、中、后、层序遍历

前序遍历:根、左、右

中序遍历:左、根、右

后序遍历:左、右、根

层序遍历:从上到下,从左到右,依次遍历 

创建二叉树

二叉树的节点

public class TestBinaryTree {
    static class TreeNode{
        public char val;
        public TreeNode left;
        public TreeNode right;

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

 手动搭建一个二叉树

    public TreeNode createTree(){
        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');
        TreeNode H=new TreeNode('H');

        A.left=B;
        A.right=C;
        B.left=D;
        B.right=E;
        E.right=H;
        C.left=F;
        C.right=G;

        return A;
    }

    public void preOrder (TreeNode root){
        if(root==null){
            return;
        }
        System.out.print(root.val+" ");
        //递归遍历左子树
        preOrder(root.left);
        //递归遍历右子树
        preOrder(root.right);
    }

    public void inOrder(TreeNode root){
        if(root==null){
            return;
        }
        inOrder(root.left);
        System.out.print(root.val+" ");
        inOrder(root.right);
    }
    public void postOrder(TreeNode root){
        if(root==null){
            return;
        }
        postOrder(root.left);
        postOrder(root.right);
        System.out.print(root.val+" ");
    }

测试

        TestBinaryTree testBinaryTree=new TestBinaryTree();
        TestBinaryTree.TreeNode root= testBinaryTree.createTree();
        testBinaryTree.preOrder(root);
        System.out.println();
        testBinaryTree.inOrder(root);
        System.out.println();
        testBinaryTree.postOrder(root);

根据 前序遍历 和 中序遍历

或者 后序遍历 和 中序遍历 可以创建二叉树

而 前序 和 后序 不能

获取整棵树的节点数size

子问题思路

左子树节点数+右子树节点数+1=整棵树的

    //求整个树的节点个数
    public int size(TreeNode root){
        if(root==null){
            return 0;
        }
        int ret=size(root.left)+size(root.right)+1;
        return ret;
    }

遍历思路

每遍历一个节点就++


    //遍历思路
    public int nodeSize;
    public void size2(TreeNode root){
        if(root==null){
            return;
        }
        nodeSize++;
        size2(root.right);
        size2(root.left);
    }

求叶子节点的个数

子问题思路

 整棵树的叶子节点个数=左树的+右树的

    public  int getLeafNodeCount(TreeNode root){
        if (root==null){
            return 0;
        }
        if (root.right==null&&root.left==null){
            return 1;
        }
        return getLeafNodeCount(root.right)+getLeafNodeCount(root.left);
    }

 遍历思路

    public  int leafSize;

    public void getLeafNodeCount2(TreeNode root) {
        if(root == null) {
            return ;
        }

        if(root.left == null && root.right == null) {
            leafSize++;
        }
        getLeafNodeCount2(root.left);
        getLeafNodeCount2(root.right);
    }

 计算第k层有多少个节点

已知前提:k是合法的


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

 求树的高度

整棵树的高度=Math.max(左树的高度和右树高度)+1

    //求树的高度
    public int getHeight(TreeNode root){
        if(root==null){
            return 0;
        }
        int leftHeight=getHeight(root.left);
        int rightHeight=getHeight(root.right);
//        return Math.max(leftHeight,rightHeight)+1;
        return leftHeight>rightHeight?
                leftHeight+1:rightHeight+1;
    }

找值为val的节点

//    找值为val的节点
    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;
    }

标签:TreeNode,--,public,return,二叉树,Java,null,root,节点
From: https://blog.csdn.net/2301_80898480/article/details/139099751

相关文章

  • 动态规划+0-1背包问题
    一、问题描述小明周末要参加学校组织的跳蚤市场活动,他准备了足球、旱冰鞋、随身听和单词书四件物品进行交易,要用他的书包把这些物品带到学校。各物品的重量w和价值v如下图所示,小明书包的最大承重量为9(忽略单位),请你帮助他找到最合理的搭配方案,使他能用书包带到学校的物品价值最......
  • 用结构体实现一个简单的学生管理系统
    使用结构体完成学生(学号、姓名、性别、成绩)管理系统1.使用菜单实现2.功能1:完成对学生信息的录入,确定人数,完成输入3.功能2:完成对学生信息的输出4.功能3:输出成绩最高和最低学生的信息5.功能4:输出学生的总成绩和平均成绩6.功能5:对学生信息按成绩进行排序,根据传......
  • 排球比赛计分程序用户画像和用户愿景
    用户画像:用户画像一:专业排球裁判•年龄:25-55岁•性别:不限•职业:专业排球裁判•技术背景:熟悉各类体育赛事的裁判规则和流程,熟练操作电子设备。•期望:•计分功能精准无误,实时反映比赛状况。•操作界面简洁明了,不分散裁判注意力。•统计功能全面,涵盖球员表现和犯......
  • test
      ▶️   ⚣  ✚ |<< ⇦ ⟳1/   ⇨  >>|  ⇩svg  ⇩ᯤX ⇩ᯤggbppt ⇩ 四   田  ⇈  ⇊  ↶ ✕  Help  notes......
  • Stream流求和
    Stream流对List<Object>和Set<Object>求和泛型为Integer、Long、Double、BigDecimal的求和使用reduce+orElseIntegersum=scores.stream().reduce(Integer::sum).orElse(0);Longsum=scores.stream().reduce(Long::sum).orElse(0L);Doublesum=scores.stream().r......
  • vue 使用svg文件图片或者组件方式
    代码<template><!--svg使用--><divclass="box"><div><!--设置stylefill:ref方式可以直接修改svg颜色样式--><svgstyle="fill:red"xmlns="http://www.w3.org/2000/svg"......
  • 值类型和引用类型
    值类型和引用类型栈和堆程序运行时,它的数据必须存储在内存中。一个数据项需要多大的内存、存储在什么地方、以及如何存储都依赖于该数据项的类型运行中的程序使用两个内存区域来存储数据:栈和堆栈定义:栈是一个内存数组,是一个LIFO(Last_InFirst_Out)后进先出的的数据结构。......
  • 代码随想录day27 递增子序列 | 全排列 | 全排列 II
    递增子序列递增子序列解题思路用set来去重,之后每次一个节点存入时与前一个节点进行大小比较,如果小就不存了,跳过剩余的回溯过程知识点回溯,去重心得在考虑去重的时候忘记了使用C++的数据结构set,得记下这个方法全排列全排列解题思路在回溯迭代的时候传入了一个统计数组元......
  • 三分钟了解自定义表单自定义工作流的多个优势
    降本、提高效率、解决信息孤岛是很多企业亟需要解决的问题。什么样的软件平台可以实现这一目标?可以随时来了解低代码技术平台。它当中的自定义表单自定义工作流拥有多个优势特点,可以为企业降低技术门槛、提高工作效率,可视化操作界面的便利性更让职场朋友们深知是实现流程化办公的......
  • JS实现复制粘贴图片
    最近在开发公司的可视化编辑器应用,同事们提了一个需求,即可以直接复制图片到编辑器中粘贴,生成对应的图片组件.因为传统的点击上传太麻烦,得先把图片保存到本地,然后再回到编辑器点击上传,选择图片.流程太长了,如果可以直接复制粘贴图片,速度会更快,体验也更好一些.......