锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. Java数据结构——二叉树的基本操作

Java数据结构——二叉树的基本操作

0
  • 软件开发
  • 发布于 2024-09-19
  • 0 次阅读
黄健
黄健

作者:敲代码の流川枫

博客主页:流川枫的博客

专栏:和我一起学java

语录:Stay hungry stay foolish

Apifox = Postman + Swagger + Mock + JMeter。集接口文档工具、接口Mock工具、接口自动化测试工具、接口调试工具于一体,提升 10 倍研发效率

1.三种遍历OJ

前序遍历

中序遍历

后序遍历

2. 获取树中节点的个数

3. 获取叶子节点的个数

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

​5.获取二叉树的高度

6. 检测值为value的元素是否存在


1.三种遍历OJ

前序遍历

前序遍历按照根左右的访问规律进行遍历,我们这里定义一个list记录返回, 使用子问题的思想遍历

import java.util.ArrayList;
import java.util.List;

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    public TreeNode() {
    }

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

    public TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}
class Solution{
    public List<Integer> preoderTraversal(TreeNode root){
        List<Integer> list = new ArrayList<>();
        if(root == null){
            return list;
        }
        list.add(root.val);
        List<Integer> leftTree = preoderTraversal(root.left);
        list.addAll(leftTree);
        List<Integer> rightTree = preoderTraversal(root.right);
        list.addAll(rightTree);
        return list;
    }

}

中序遍历

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if(root == null){
            return list;
        }
        List<Integer> lefttree = inorderTraversal(root.left);
        list.addAll(lefttree);
        list.add(root.val);
        List<Integer> righttree = inorderTraversal(root.right);
        list.addAll(righttree);
        return list;

    }
}

后序遍历

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if(root == null){
            return list;
        }
        List<Integer> lefttree = postorderTraversal(root.left);
        list.addAll(lefttree);
        List<Integer> righttree = postorderTraversal(root.right);
        list.addAll(righttree);
        list.add(root.val);
        return list;
    }
}
  1. 获取树中节点的个数

还是在上次创建的二叉树中进行操作

方法一:遍历整个树

代码

 public static  int nodeSize = 0;
    int size(TreeNode root){
        if(root == null){
            return 0;
        }
        nodeSize++;
        size(root.left);
        size(root.right);
        return nodeSize;
    }

测试

class Test{
    public static void main(String[] args) {
        TestBianryTree testBianryTree = new TestBianryTree();
        TestBianryTree.TreeNode root = testBianryTree.creatTree();
        testBianryTree.postOrde(root);
        System.out.println();
        System.out.println("==========");
        int length = testBianryTree.size(root);
        System.out.println(length);
    }
}

方法二: 分解成子问题

节点个数 = 左子树总节点+右子树总节点+1

int size2(TreeNode root){
        if(root == null){
            return 0;
        }
        int leftsize = size2(root.left);
        int rightsize = size2(root.right);
        return leftsize+rightsize+1;
    }

  1. 获取叶子节点的个数

方法一:分解为子问题

代码

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

测试

int count = testBianryTree.getLeafNodeCount(root);
        System.out.println(count);

方法二:遍历

定义一个计数器,当节点的左右子树同时为空时,说明这是叶子节点

代码

 public static int count = 0;
    void getLeafNodeCount2(TreeNode root){
        if(root == null){
            return ;
        }
        if(root.left == null && root.right == null){
            count++;
        }
        getLeafNodeCount2(root.left);
        getLeafNodeCount2(root.right);
    }

测试

System.out.println("==========");
        testBianryTree.getLeafNodeCount2(root);
        System.out.println(testBianryTree.count);

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

相对于根节点的k层,就是根节点左树的K-1层+根节点右树的K-1层

代码

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

测试

int k = testBianryTree.getKLevelNodeCount(root,3);
        System.out.println(k);

5.获取二叉树的高度

子问题的求解思路,求出左右子树的高度,相比较,返回最大的为树的高度

代码

int getHeight(TreeNode root){
        if(root == null){
            return 0;
        }
        int lefttree = getHeight(root.left);
        int righttree = getHeight(root.right);
        return lefttree > righttree ? lefttree + 1 : righttree + 1;
    }

测试

System.out.println("============");
        int height = testBianryTree.getHeight(root);
        System.out.println("树的高度:"+height);

注意不要将返回值写成这样:

return  getHeight(root.left)>getHeight(root.right)
                ? getHeight(root.left)+1:getHeight(root.right)+1;

这样会出现重复递归的情况,测试用例较多时会运行超时

  1. 检测值为value的元素是否存在

先判断根节点的值是否是要找的值,然后再继续判断左右子树的值是否是要找的值

代码

 TreeNode find(TreeNode root,int val){
        if(root == null){
            return null;
        }
        if(root.val == val){
            return root;
        }
        TreeNode lefttree = find(root.left,val);
        if(lefttree != null){
            return lefttree;
        }
        TreeNode righttree = find(root.right,val);
        if(righttree != null){
            return righttree;
        }
        return null;
    }

测试

System.out.println("===========");
        TestBianryTree.TreeNode treeNode = testBianryTree.find(root,'A');
        System.out.println(treeNode.val);

" 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!

原文链接: https://blog.csdn.net/chenchenchencl/article/details/127171607

标签: #软件开发 1171 #JAVA 991
相关文章

万字:支付“核心系统”详解 2024-11-02 15:33

专栏作者:隐墨星辰 \| 主编:陈天宇宙 这篇文章也尝试化繁为简,探寻支付系统的本质,讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付行业已经过了风头最劲的时光,但跨境支付仍然在蓬勃发展,每年依然有很多新人进入这个行业,这篇文章尝试为这些刚入行的新人提供一点帮助。 文章只介绍一些支付行业十几

资深支付架构师视角:实战从问题定义到代码落地的完整套路 2024-11-02 15:33

前言 今天从一个实际案例入手,介绍站在架构师的角度,如何识别并定义问题,提炼需求,技术方案选型,再到详细设计,最后利用AI的能力协助写出核心的代码,验证与调优。 解决问题存在一定的模式,也可以称之为框架,总结出自己的思考和解题框架,以后再碰到同类型的问题就可以如庖丁解牛一样容易。 很多年前,我写代码

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

设计模式第16讲——迭代器模式(Iterator) 2024-10-08 11:24

一、什么是迭代器模式 迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 二、角色组成 抽象迭代器(Iterator):定义了遍历聚合对象所需的方法

vue2路由和vue3路由区别及原理 2024-10-08 11:24

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。 import Vue from 'vue';import VueRouter from 'vue-router';i

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.