实现一个AI大模型当前都无法正确实现的基础二叉树读取算法

AI人工智能学习路径图 都看了昨天的热搜没有?韩国首位AI女主播金柱夏诞生,瞧瞧,这就是科技的力量啊!用智能代替人工解放人力,相信在未来这一定是个大的发展趋势,这时候可能就有人想要进入这个行业了,那么今天,小编就来给大家分享下AI人工智能的学习路径,帮助大家去学习与理解。 第一阶段:前置python基础知识 知识点: 1)Python环境搭建和基本概念 计算机组成、Python简介、变量和注释、bug和debug工具、常见数据类型、字符串的输出 2)基础运算与条件判断 输入、类型转换、算数运算、赋值及复合赋值运算、 阅读详情

概述

图1: 

图2:

上图帮大家温习完全二叉树的概念,本文讲的是完全顺序二叉树的初始化

华为的员工、考过华为OD的员工、参加过其他类似大厂的考试的员工一般做过二叉树的初始化,甚至有些还碰到过手撕代码时面试官要求做二叉树遍历,看完本文的读者,我相信一定能拿到比较高的评分(尽管手撕的时候面试官一般不会要你关心二叉树的动态构造,只要写初始化一个固定的树跑过测试就行)。

对华为或华为OD感兴趣的同学可以参看文章:

华为OD入门级、工作级、专业级技术技能知识点要求及职级薪资表

Java初始化顺序二叉树 

百度AI初始化顺序二叉树

 百度AI生成的代码分析:

1、buildTree方法明显逻辑错误

理由:左节点如果是index*2+1,那么根节点就应该是0,而实际root又是用1初始化的。

其他的我就不详细分析了,核心逻辑都错了结果一定也是错的

读者可以亲自在百度上试验。并在本地用其代码验证。

作者初始化顺序二叉树

在这之前先给大家看一下我们传奇人物塔子哥的题库中的这一道题:

完全二叉树非叶子部分后序遍历(100分) - Problem Detail - CodeFun2000

可能需要付费,不过没关系作者截图出来:

 额,作者代码注释中也有原题,下面看作者代码实现:

import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;

/**
 * @Description: #P2988. 完全二叉树非叶子部分后序遍历(100分
 *
给定一个以顺序储存结构存储整数值的完全二叉树序列(最多1000个整数),请找出此完全二叉树的所有非叶子节点部分,然后采用后序遍历方式将此部分树(不包含叶子)输出。
只有一个节点的树,此节点认定为根节点(非叶子)。
此完全二叉树并非满二叉树,可能存在倒数第二层出现叶子或者无右叶子的情况
其他说明:二叉树的后序遍历是基于根来说的,遍历顺序为:左-右-根

输入描述
一个通过空格分割的整数序列字符串
输出描述
非叶子部分树结构。备注:输出数字以空格分隔

样例1
输入
1 2 3 4 5 6 7
输出
2 3 1
说明
找到非叶子部分树结构,然后采用后序遍历输出。

                   1
                /    \
               2       3
             /  \      /  \
           4     5     6     7
        /  \   /  \  /  \    /  \
       8   9  10 11 12  13  14  15

 * @Author: Dand
 * @CreateDate: 2025/6/22 22:06
 * @Version: 1.0
 */
public class Main {
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int[] arr= Arrays.stream(sc.nextLine().split("\\ ")).mapToInt(Integer::parseInt).toArray();

        Node root = new Root(arr);

        // 后序遍历
        Stack<Node> stack = new Stack<Node>();
        while (true){
            if (root != null){
                stack.push(root);
                root = root.getLeft();
            } else {
                if (stack.isEmpty())
                    return;
                if (null == stack.peek().getRight()) {// 叶子
                    root = stack.pop();
//                    System.out.print(root.getData() + " ");  // 不打叶子
                    while (root == stack.peek().getRight()) {
                        root = stack.pop();
                        System.out.print(root.getData() + " ");  // 只打非叶子
                        if (stack.isEmpty()) {
                            break;
                        }
                    }
                }
                if (!stack.isEmpty())
                    root = stack.peek().getRight();
                else
                    root = null;
            }
        }
    }
}

class Node<T> {
    public T data;

    public Node<T> left;
    public Node<T> right;

    Node(T e){
        data = e;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public Node<T> getLeft() {
        return left;
    }

    public Node<T> getRight() {
        return right;
    }

    public void setLeft(Node<T> node){
        this.left = node;
    }
    public void setRight(Node<T> node){
        this.right = node;
    }
}

class Root extends Node {
    public Integer data;
    public Node<Integer> left;
    public Node<Integer> right;

    Root(int[] arr){
        // size 一定要大于0
        super(arr[0]);
        int size = arr.length;

        if (size > 0) {
            data = arr[0]; // 根节点是数组第一个值
            buildTree( this, 1, size , arr);
        }
    }

    /**
     *
     * @param node
     * @param index 从1开始
     * @param size
     * @param arr
     */
    private void buildTree(Node node, int index, int size, int[] arr) {
        if ( index * 2 <= size ) {
            node.left = new Node(arr[index * 2-1] ); // 左子节点值是 2*index + 1
            buildTree( node.left, index * 2, size, arr ); // 递归构建左子树
            if (index * 2 + 1 <= size) { // 如果有右子节点
                node.right = new Node(arr[index * 2] ); // 右子节点值是2*index + 2
                buildTree( node.right, index * 2 + 1, size, arr ); // 递归构建右子树
            }
        }
    }
}

代码走读:

1、作者将用户输入读入int[]中

2、实际输入不一定是连续的数字

3、如果是连续数字这行用值 index*2初始化即可

node.left = new Node(arr[index * 2-1] ); 

因数组索引是0开始,所以以第1个左子节点为例:第2个节点值在整型数组中的索引就是1,遵循AI开始的逻辑,构建ROOT的子树时传的index为1,所以上面 index * 2-1刚好是1(输入的数组中第二个数:arr[index * 2-1])

4、作者树采用先创建了一个能用的父类,不用场景可实现不同的子类

5、本题中data只是个简单的整型值,解决实际问题(如saas平台健康度的决策树,因然健康度一般为多叉树,逻辑有些不一样,也差不了多少)时读者可以把子类中的data换成数据对象

6、本题要求后序遍历,所以作者使用栈实现了后序遍历

7、相比递归,栈占用更少的cpu和内存。

8、本题要求不打印叶子,所以只要注释掉内部while循环前的那边打印语句

               if (null == stack.peek().getRight()) {// 叶子
                    root = stack.pop();
//                    System.out.print(root.getData() + " ");  // 不打叶子
                    while (root == stack.peek().getRight()) {
                        root = stack.pop();
                        System.out.print(root.getData() + " ");  // 只打非叶子
                        if (stack.isEmpty()) {
                            break;
                        }
                    }
                }

递归

简单

先序

    /**
     * 递归先序遍历
     * @param root
     */
    private void priOrderWithRecursion(BinaryTreeNode root) {
        if (null != root) {
            System.out.print(root.getValue() + "\t");
            priOrderWithRecursion(root.getLeftChild());
            priOrderWithRecursion(root.getRightChild());
        }
    }

后序

    /**
     * 递归后序遍历
     * @param root
     */
    private void postOrderWithRecursion(BinaryTreeNode root) {
        if (null != root) {
            postOrderWithRecursion(root.getLeftChild());
            postOrderWithRecursion(root.getRightChild());
            System.out.print(root.getValue()+ "\t");
        }
    }

中序

    /**
     * 递归中序遍历
     * @param root
     */
    private void inOrderWithRecursion(BinaryTreeNode root) {
        if (null != root) {
            inOrderWithRecursion(root.getLeftChild());
            System.out.print(root.getValue() + "\t");
            inOrderWithRecursion(root.getRightChild());
        }
    }

栈(非递归)

占更少的计算资源,更好的性能 

先序

    /**
     * 非递归先序遍历,虽然是采用栈的方式,但是并未完全应用栈的思想,采取循环过程中输出的方式来遍历
     * @param root
     */
    private void preOrder(BinaryTreeNode root) {
        Stack<BinaryTreeNode> stack = new Stack<>();
        while (null != root || !stack.isEmpty()) {
            while (null != root) {
                System.out.print(root.getValue() + "\t");
                stack.push(root);
                root = root.getLeftChild();
            }
            if (!stack.isEmpty()) {
                root = stack.pop();
                root = root.getRightChild();
            }
        }
    }

后序

见上面 作者初始化顺序二叉树  章节的代码(包含了后序遍历)。

中序

    /**
     * 非递归中序遍历
     * @param root
     */
    private void inOrder(BinaryTreeNode root) {
        Stack<BinaryTreeNode> stack = new Stack<>();
        while (null != root || !stack.isEmpty()) {
            while (null != root) {
                stack.push(root);
                root = root.getLeftChild();
            }
            if (!stack.isEmpty()) {
                root = stack.pop();
                System.out.print(root.getValue() + "\t");
                root = root.getRightChild();
            }
        }
    }

二叉树的概念

二叉树是一种每个节点最多有两个子树的树结构‌,广泛应用于计算机科学领域,是数据结构中最基本且重要的非线性存储形式之一。其核心特征包括递归定义、有序性和节点度限制(不超过2)。

‌基本定义‌

二叉树(Binary Tree)是由节点构成的有限集合,该集合要么为空,要么由一个根节点及其两棵互不相交的子树组成,分别称为左子树和右子树。这两棵子树同样遵循二叉树的定义,形成递归结构。‌‌

‌关键特性‌

  1. ‌节点度限制‌:每个节点的子节点数不超过2,区别于普通树结构。‌‌
  2. ‌有序性‌:即使节点数量相同,左右子树的顺序不同也会被视为不同的二叉树。‌‌
  3. ‌递归定义‌:子树本身也是二叉树,允许通过递归算法高效处理。‌‌‌‌

‌常见类型‌

  • ‌满二叉树‌:所有非叶子节点均有左右子树,且所有叶子节点在同一层。
  • ‌完全二叉树‌:除最后一层外,其他层节点数达到最大值,且最后一层节点从左向右连续排列。‌‌
python 读取内存二叉树_二叉树类python python中的树数据结构线性数据中的典型顺序表和链表已经讲完:《顺序表数据结构在python中的应用》《python实现单向链表数据结构及其基本方法》《python实现单向循环链表数据结构及其方法》《python实现双向链表基本结构及其基本方法》《python实现双向循环链表基本结构及其基本方法》《pytho...文章python之战2019-04-101338浏览量python数据结构与算法总... 阅读详情

相关推荐

数据结构与算法基础(软件设计师备考笔记)

目录 第六章.数据结构与算法基础(重点) 第一节.数组及稀疏矩阵 第二节.数据结构的定义及线性表的概念 第三节.顺序存储与链式存储的比较 第四节.线性表——队列与栈 第五节.广义表 第六节.非线性结构——树与二叉树(import) 第七节.非线性结构——图 第八节.算法基础 第九节.查找——顺序查找、二分查找、散列表 第十节.数据的排序 第六章.数据结构与算法基础(重点) 上午下午都会考,且难度最高 重点:线性表、树与二叉树、排序与查找、算法基础及常见算法 第一节.数组及稀疏矩

imreal_的博客 1万+

算法+AI双轨学习路径:从数据结构到大模型应用

在计算机技术体系中,数据结构是构建高效程序的基石,而机器学习则让系统具备从数据中学习规律的能力。两者看似独立,实则紧密关联:无论是搜索推荐、图像识别,还是大模型应用,底层都依赖算法设计思想与模型训练原理的协同。理解这种关联,需要从基础概念出发,掌握排序、动态规划等经典算法,并同步理解梯度下降、反向传播等核心原理。这种双轨学习路径的价值在于,既能夯实编程基本功,又能建立数据驱动决策的思维,从而在实际工程中高效解决特征工程、模型优化、推理加速等问题。从经典机器学习到深度学习,再到当前热门的RAG与AI Agen

weixin_34326429的博客 519

AI技术浪潮下,应届生与开发者如何掌握大模型、AI Agent与AI Infra核心技能

在人工智能技术快速发展的今天,深度学习、自然语言处理(NLP)和计算机视觉(CV)等基础技术概念构成了现代AI系统的基石。其核心原理在于通过神经网络模型从海量数据中学习规律,实现感知、认知和决策。这一技术价值在于能够自动化处理复杂任务,提升效率并创造新的产品形态。应用场景已广泛渗透到金融科技、智能客服、内容生成和自动化编程等多个领域。随着技术从研究走向工程化落地,掌握大模型、AI Agent(智能体)和AI Infra(基础设施)等关键热词所代表的技术栈,成为开发者构建可落地AI应用、应对规模化挑战的必备能

weixin_34212762的博客 389

人工智能学习指南:零基础起步,一篇文章带你精通大模型

01—

m0_63171455的博客 712

【人工智能 数据结构与算法】——深入详解人工智能基础:基本数据结构及其实现与应用场景

在人工智能(AI)领域,数据结构是构建高效算法和系统的基石。了解和掌握基本数据结构的实现方式及其应用场景,对于设计和优化AI模型至关重要。本文将深入探讨AI基础中的基本数据结构,包括数组、链表、栈、队列、树、图等,详细解析它们的实现方法及在人工智能中的具体应用。

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 2006

保姆级教程:手把手教你从ENSEMBL官网下载GRCh38/GRCh37的GTF注释文件(附网址规律总结)

本文提供从ENSEMBL官网下载GRCh38/GRCh37的GTF注释文件的详细教程,包括路径解析、版本号确定和下载命令示例。特别解析了GRCh37的特殊存储结构,并分享批量下载、文件校验等高级技巧,帮助生物信息学研究者高效获取基因组注释文件。

weixin_29289821的博客 204

从零开始学AI,给你最最全套的人工智能学习路线图

从零开始学AI,给你最最全套的人工智能学习路线图

AAI666666的博客 2103

10分钟上手YOLOv11:最强姿态估计模型来了,代码开源,效果炸裂!

【10分钟玩转YOLOv11实时姿态估计】🚀 YOLOv11作为YOLO家族最新成员,在速度、精度和易用性上全面升级,尤其适用于姿态估计等复杂视觉任务。本文带您快速掌握: 1️⃣ 核心概念:姿态估计即识别人体17个关键点(如关节部位)并连接成数字骨架,是智能健身、体感游戏等应用的基础。 2️⃣ 技术优势: 超轻量级(最小仅2.9M参数) 极速推理(GPU仅1.7ms) 高精度(COCO mAP@50-95达50%) 3️⃣ 三步实操: ① 安装:pip install ultralytics ② 准备人物

weixin_41246802的博客 1783

AI学习之旅:全方位人工智能学习路线图,从零开始打造专家之路

01—

2401_85343303的博客 1461

逆向实战:如何绕过iTunes 12.6.5.3的反调试机制(附X64dbg插件配置)

本文深入剖析了iTunes 12.6.5.3的反调试机制与登录协议。通过X64dbg动态调试与IDA静态分析,详细演示了如何绕过其反调试检测,并定位到核心的登录协议加密函数,揭示了其请求签名(X-Apple-ActionSignature)的生成逻辑与依赖关系,为客户端安全研究与协议分析提供了实战思路。

weixin_29202213的博客 740

从JT808/JT1078协议到多端协同:构建高并发北斗车辆监控平台的技术实践

本文详细介绍了基于JT808/JT1078协议构建高并发北斗车辆监控平台的技术实践,包括协议解析、高并发架构设计、多端协同实现及数据持久化策略。通过Netty、Kafka等技术优化,系统成功支撑日均2000万条消息处理,为GPS车辆动态监控系统提供了可靠解决方案。

weixin_28358083的博客 224

《AI之路:从零到精通的人工智能学习指南》

01—

2401_84494441的博客 1204

C语言实战:高效端口扫描器的多线程优化与性能对比

本文详细介绍了使用C语言开发高效端口扫描器的多线程优化技术,包括TCP全连接扫描、SYN半连接扫描和FIN扫描的实现原理。通过线程池、I/O复用技术和性能优化策略,显著提升扫描效率,并与Nmap进行性能对比。文章还涵盖了常见问题解决方案及安全伦理注意事项,为开发者提供全面的实战指导。

ol789012的博客 134

二叉树:广义表搭建二叉树

使用广义表搭建二叉树(及层序遍历) 问题概要 二叉树是非常常见的数据结构,那么,如何从无到有构建一棵二叉树呢?比较主流的方法就是输入一个广义表,例如A(B(D),C),这种形式。那么,如何把这种字符串转变为对应的,用指针相连的二叉树,这个问题很常见,故记录如下。(这里假定树的节点内容均为大写英文字符。) 算法思路 首先,为了建立树,必须建一个根节点。 为了在这棵树上运动,建立一个指针,指向当前操作...

SWY's Workshop 1万+

华为OD机试双机位C卷:日志排序 (Py/C/C++/Java/Js/Go)

华为OD机试双机C卷真题【日志排序】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试-日志排序。

qq_45776114的博客 1754

接口电路设计的关键要点

接口电路设计是嵌入式硬件开发的核心环节,本文系统阐述了五大关键设计要点:1)电平匹配技术,详细分析了3.3V/5V系统互连方案及转换电路计算;2)阻抗匹配原理,包括高速信号反射机制及差分信号处理;3)滤波与去耦设计,提出多级电容配置和"先电容后过孔"布局原则;4)接地设计规范,重点说明模拟/数字地分离及高速信号回流路径;5)防护电路设计,涵盖防反接、过流保护及ESD防护方案。文章通过具体计算公式、器件选型指南和布局技巧,为接口电路设计提供了系统化的解决方案,并附有设计检查清单和典型问题分

weiyvyy的博客 453

【数据结构与算法】详解 “清华大学(考研)OJ题”_ 二叉树重要面试OJ题

💛 前情提要💛本章节是的的相关知识~接下来我们即将进入一个全新的空间,对代码有一个全新的视角~以下的内容一定会让你对有一个颠覆性的认识哦!!!❗以下内容以的方式实现,对于来说最重要的是哦❗以下内容干货满满,跟上步伐吧~作者介绍:二叉树的层序遍历二叉树重要面试OJ题🔥算法思想💡广度优先遍历: 对于二叉树来说又称为即访问顺序不同与、、遍历【这三种遍历统称为:】要递归访问完一个分支后才返回再递归访问剩下的分支而就是一层一层的遍历树的结点,遍历完一层后,才遍历下一层,直至遍历完整棵树❗特别注意:对于,我们一....

Dream_Y.ocean的博客 1925

Agent智能体:核心概念与架构——建立系统认知

本文摘要介绍了Agent智能体的核心概念与架构设计。主要内容包括: Agent定义与分类:阐述了Agent作为能够感知环境、决策执行的智能实体,重点分析了现代基于大语言模型(LLM)的Agent架构。 核心模块组成:详细说明了Agent的五大核心模块(感知、规划、记忆、工具和执行)及其交互流程。 UML建模展示:通过类图和序列图,清晰呈现了Agent系统的静态结构和动态执行过程。 项目结构设计:给出了模块化的代码目录结构,为实际开发提供参考框架。

lza_csdn2019的博客 633

从零开始学AI,人工智能学习路线图

01—

2401_84587944的博客 1460

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【图解算法】-CH1二叉树层级遍历

算法描述 从上往下,从左往右,层级遍历二叉树 解题思路 初始化head和tail标识在队列前 将节点放入队列,并同时移动tail标识同步往后 head标识每次前进1,读取节点,并将该节点的左右子节点依次放入队列,同时移动tail节点到末尾 直到head标识移动到tail位置 图解示例 代码实现 //节点类 public class TreeNode { private...

tingfeng6623的专栏 188

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数据结构实验——基于二叉树的表达式求值算法

这题确实是GPT加自己改代码水过去的。。。这个二叉树根本写不来。不过代码实现虽然难,但是二叉树的表达式求值我们得知道是什么东西。我们已知的算术表达式相当于一颗二叉树中序遍历的结果,因此我们需要还原出这棵树,这是学数据结构的基本能力。其它的交给询问AI的能力了。

xinghuayu_lin的博客 1154

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: 【Druid最佳实践】Druid报An I/O error occurred while sending to the backend等相关问题总结
下一篇: SkyWalking异步采集spring gateway日志
飞火流星02027
博客等级 码龄19年 782粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞火流星02027

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值