算法——树查找算法

2023-10-30

树查找

对于层次结构的树,需要遍历其节点,根据遍历方式不同,可分为广度优先和深度优先,对于如下树结构

class TreeNode<T> {

    T value;
    TreeNode<T> leftChild;
    TreeNode<T> rightChild;

    TreeNode(T value) {
        this.value = value;
    }
}

广度优先搜索

从根节点开始判断,若元素不相等,则将其左右节点存进队列,利用队列先进先出的性质从上往下从左往右依次遍历节点

public <T> boolean BreadthFirstSearch(TreeNode<T> root, T value) {
    Queue<TreeNode<T>> queue = new LinkedList<>();
    StringBuilder stringBuilder = new StringBuilder();
    queue.offer(root);
    while (!queue.isEmpty()) {
        TreeNode<T> node = queue.poll();
        stringBuilder.append(node.value + " ");
        if (node.value == value) {
            System.out.println(stringBuilder.toString() + "found");
            return true;
        }
        if (node.leftChild != null) {
            queue.offer(node.leftChild);
        }
        if (node.rightChild != null) {
            queue.offer(node.rightChild);
        }
    }
    System.out.println(stringBuilder.toString() + "not found");
    return false;
}

调用过程

TreeNode<Integer> node1 = new TreeNode<>(1);
TreeNode<Integer> node2 = new TreeNode<>(2);
TreeNode<Integer> node3 = new TreeNode<>(3);
TreeNode<Integer> node4 = new TreeNode<>(4);
TreeNode<Integer> node5 = new TreeNode<>(5);
node1.leftChild = node2;
node1.rightChild = node3;
node2.leftChild = node4;
node2.rightChild = node5;

BreadthFirstSearch(node1, 4);

深度优先搜索

从根节点开始判断,若元素不相等,则将其左右节点存进栈,利用栈先进后出的性质从上往下依次遍历节点

public <T> boolean DepthFirstSearch(TreeNode<T> root, T value) {
    Stack<TreeNode<T>> stack = new Stack<>();
    StringBuilder stringBuilder = new StringBuilder();
    stack.push(root);
    while (!stack.isEmpty()) {
        TreeNode<T> node = stack.pop();
        stringBuilder.append(node.value + " ");
        if (node.value == value) {
            System.out.println(stringBuilder.toString() + "found");
            return true;
        }
        if (node.rightChild != null) {
            stack.push(node.rightChild);
        }
        if (node.leftChild != null) {
            stack.push(node.leftChild);
        }
    }
    System.out.println(stringBuilder.toString() + "not found");
    return false;
}
  • 若右节点先入栈,则先遍历左子树
  • 若左节点先入栈,则先遍历右子树

调用过程

TreeNode<Integer> node1 = new TreeNode<>(1);
TreeNode<Integer> node2 = new TreeNode<>(2);
TreeNode<Integer> node3 = new TreeNode<>(3);
TreeNode<Integer> node4 = new TreeNode<>(4);
TreeNode<Integer> node5 = new TreeNode<>(5);
TreeNode<Integer> node6 = new TreeNode<>(6);
node1.leftChild = node2;
node1.rightChild = node3;
node2.leftChild = node4;
node2.rightChild = node5;
node3.leftChild = node6;

DepthFirstSearch(node1, 6);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法——树查找算法 的相关文章

随机推荐

  • 图像的频谱图简单理解

    https zhuanlan zhihu com p 99605178 utm source qq https blog csdn net dazhuan0429 article details 85774692 一维信号的傅里叶变换 将一
  • Keil 5报错identifier “KEY0“ is undefined怎末解决呀大侠们【哭】

    错误 HARDWARE EXTI exti c 42 error 20 identifier KEY0 is undefined key c include key h include delay h 按键初始化函数 PA0 15和PC5
  • 把一个对象的key全部换成大写/小写

    前言 把一个对象 他的key都是大写 或者小写的情况下给他转换类型 大写 小写 实现效果 实现方法 1 封装两个方法 大写转换 export function upperJSONKey jsonObj for var key in json
  • robot framework 使用五:CentOS上运行robot framework 并自动发送测试结果

    操作系统版本 centos 6 0 x86 64 想要在linux上运行robot framework的测试用例 需要安装以下工具和软件 1 安装python 2 7 6 首先python version 查看系统是否装有python 并且
  • Python编程:实现整数反转(含完整源代码)

    Python编程 实现整数反转 含完整源代码 在Python中 实现整数反转非常简单 我们只需要将整数转换为字符串 然后对字符串进行反转操作 最后再将反转后的字符串转换回整数即可完成整数反转 下面是实现整数反转的Python源代码 def
  • 深入浅出--梯度下降法及其实现

    转自 https www jianshu com p c7e642877b0e 深入浅出 梯度下降法及其实现 六尺帐篷 关注 2018 01 17 21 06 字数 3001 阅读 1210 评论 2 喜欢 23 赞赏 1 梯度下降的场景假
  • 常用文件的文件头(十六进制)

    JPEG jpg 文件头 FFD8FF PNG png 文件头 89504E47 GIF gif 文件头 47494638 TIFF tif 文件头 49492A00 Windows Bitmap bmp 文件头 424D CAD dwg
  • 嘀嗒出行再闯IPO:千军万马我无懈

    羽扇纶巾笑谈间 千军万马我无懈 在激烈竞争中再度冲刺港交所IPO的嘀嗒出行 闪露出一丝歌词里的气魄 交通运输部下属网约车监管信息交互系统的数据显示 截至2023年1月31日 全国共有300家网约车平台公司取得网约车平台经营许可 在2022年
  • 隐式声明函数‘raw_copy_to_user’的问题

    隐式声明函数 raw copy to user 的问题 其实一般来说都是隐式声明函数 copy to user 的问题 这类问题你就看看有没有引用正确的头文件 例如有些是
  • 一些常见面试OO design题目总结

    最近很多公司面试喜欢问一些OO design的题目 我总结了一些比较高频的题目 需求不一定准确 设计的也不一定好 欢迎提出建议 1 电梯设计 2 停车厂设计 3 通用卡牌游戏blackjack设计 4 1 电梯设计 需求 以面向对象的方式设
  • vue知识点总结

    vue知识点总结 1 vue是渐进式的javaScript框架 其作者是尤雨溪是以为华裔前google工程师 是一个动态构建用户界面 个人理解为可以在一个界面中动态展示其中某一部分的数据显示 运行 转换等功能 相比于jsp html页面有着
  • VRRP技术(详解)

    一 VRRP的概述 用户一般都是采用一个默认的网关来访问外部网络 如果此时默认网关设备发生故障 将中 断所有用户终端的网络访问 导致不可挽回的损失 VRRP可以实现多网关 并且可以解决多网关运行中冲突的错误 二 VRRP术语 VRRP路由器
  • jvm面试题,jvm常见高频面试题汇总,必知必会

    1 Java 类加载过程 Java 类加载需要经历一下 7 个过程 1 加载 加载是类加载的第一个过程 在这个阶段 将完成一下三件事情 通过一个类的全限定名获取该类的二进制流 将该二进制流中的静态存储结构转化为方法去运行时数据结 构 在内存
  • 线程安全性分类

    1 不可变 不可变的对象一定是线程安全的 并且永远也不需要额外的同步 因为一个不可变的对象只要构建正确 其外部可见状态永远也不会改变 永远也不会看到它处于不一致的状态 Java 类库中大多数基本数值类如Integer String和BigI
  • Mysql5.7 + 查询并解析json数据方法(后转)

    说明 本文是对 Mysql5 7 查询并解析json数据方法 的补充说明 具体请点击查看 当前 也可以认为就是水贴 对于某个属性的值未数组的时候 我们取某一条中某一条某个元素 大家应该都理解了 具体 如下 详情请看上一篇 Mysql5 7
  • HBase Java API使用IDEA开发----mapreduce读取hdfs文件写入hbase

    一 配置hadoop读取hbase的支持包 在hadoop env sh 添加export HADOOP CLASSPATH HBASE HOME lib 没有配置HBASE HOME的去 etc profile配置环境变量 路径根据你自己
  • Verilog 实现千兆网UDP协议 基于88E1111--数据接收

    注 此版本没有添加ARP PING 等 未完待续 注 项目采用Verilog开发 基于Vivado编译器 注 本版本没有计算校验 与上一篇相同开发环境 采用三段式状态机 同样 接收后将数据写入FIFO 相比于数据发送更为简单 只需在写入数据
  • 蚁群算法原理及python实现

    蚁群算法 ACO 是属于元启发式算法的一种 是一种群体的智能方法 算法原理 蚂蚁在寻找食物源时 会在其经过的路径上释放一种信息素 并能够感知其它蚂蚁释放的信息素 信息素浓度的大小表征到食物源路径的远近 信息素浓度越高 表示对应的路径距离越短
  • 通过按钮实现跳转新的xml界面

    首先创建关联跳转xml文件的class文件 package com example androidui import android app Activity import android os Bundle public class Ac
  • 算法——树查找算法

    树查找 对于层次结构的树 需要遍历其节点 根据遍历方式不同 可分为广度优先和深度优先 对于如下树结构 class TreeNode