日撸 Java 三百行day25-26

news2024/11/27 9:54:41

文章目录

  • 说明
  • day25 二叉树深度遍历的栈实现 (中序)
    • 1.具有通用性的对象栈
    • 2.栈实现中序遍历
      • 2.1 思路
      • 2.2 代码
  • day26 二叉树深度遍历的栈实现 (前序和后序)
    • 1.前序遍历
    • 2.后序遍历

说明

闵老师的文章链接: 日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客
自己也把手敲的代码放在了github上维护:https://github.com/fulisha-ok/sampledata

day25 二叉树深度遍历的栈实现 (中序)

1.具有通用性的对象栈

package datastructure.stack;

import sun.applet.Main;

public class ObjectStack {
    /**
     * The depth.
     */
    public static final int MAX_DEPTH = 10;

    /**
     * The actual depth.
     */
    int depth;

    /**
     * The data
     */
    Object[] data;

    /**
     * Construct an empty sequential list.
     */
    public ObjectStack() {
        depth = 0;
        data = new Object[MAX_DEPTH];
    }

    /**
     * Overrides the method claimed in Object, the superclass of any class.
     * @return
     */
    public String toString() {
        String resultString = "";
        for (int i = 0; i < depth; i++) {
            resultString += data[i];
        }

        return resultString;
    }

    /**
     * Push an element.
     * @param paraObject  The given object.
     * @return Success or not.
     */
    public boolean push(Object paraObject){
        if (depth == MAX_DEPTH) {
            System.out.println("Stack full.");
            return false;
        }

        data[depth] = paraObject;
        depth++;

        return true;
    }

    /**
     * Pop an element.
     * @return The object at the top of the stack.
     */
    public Object pop() {
        if (depth == 0) {
            System.out.println("Nothing to pop.");
            return '\0';
        }

        Object resultObject = data[depth - 1];
        depth--;

        return resultObject;
    }

    /**
     * Is the stack empty?
     * @return True if empty.
     */
    public boolean isEmpty() {
        if (depth == 0) {
            return true;
        }

        return false;
    }

    public static void main(String args[]) {
        ObjectStack tempStack = new ObjectStack();

        for (char ch = 'a'; ch < 'm'; ch++) {
            tempStack.push(new Character(ch));
            System.out.println("The current stack is: " + tempStack);
        }

        char tempChar;
        for (int i = 0; i < 12; i++) {
            tempChar = ((Character)tempStack.pop()).charValue();
            System.out.println("Poped: " + tempChar);
            System.out.println("The current stack is: " + tempStack);
        }
    }

}

2.栈实现中序遍历

2.1 思路

结合下图,先考虑假设一颗最简单的二叉树,一个根结点a和左右两个子结点b,c,利用栈,a,b入栈,将b出栈,判断b是否有右孩子,无则继续出栈a,再判断a是否有右孩子,有c,则将c入栈,再判断c是否有左孩子若无,再出栈,再判断c是否有右孩子,无,则顺序是b-a-c

在这里插入图片描述
由最简单的二叉树到一般二叉树,我们知道中序遍历顺序是左-根-右,结合栈,先将左子树的左节点入栈(左子树不为空),当最左节点入栈后就开始出栈,每出一个节点就要判断是否有右子树,若有则需要入栈(这又像一颗子树,又要重复和原来一样的操作,入最左结点再出栈判断出栈结点是否有右子树),操作和那最大那一棵树的操作一样。(看着图理解就一目了然了)
在这里插入图片描述

2.2 代码


    /**
     * In-order visit with stack.
     */
    public void inOrderVisitWithStack(){
        ObjectStack tempStack = new ObjectStack();
        BinaryCharTree tempNode = this;
        while (!tempStack.isEmpty() || tempNode != null){
            if (tempNode != null){
                tempStack.push(tempNode);
                tempNode = tempNode.leftChild;
            } else {
                tempNode = (BinaryCharTree)tempStack.pop();
                System.out.print("" + tempNode.value + " ");
                tempNode = tempNode.rightChild;
            }
        }
    }

在这里插入图片描述

day26 二叉树深度遍历的栈实现 (前序和后序)

1.前序遍历

前序遍历顺序是根-左-右 ,而在入栈时入栈顺序和中序是一样的,而要输出中序顺序,则需要修改一下,在push之前先输出

    /**
     * Pre-order visit with stack.
     */
    public void preOrderVisitWithStack() {
        ObjectStack tempStack = new ObjectStack();
        BinaryCharTree tempNode = this;
        while (!tempStack.isEmpty() || tempNode != null) {
            if (tempNode != null) {
                System.out.print("" + tempNode.value + " ");
                tempStack.push(tempNode);
                tempNode = tempNode.leftChild;
            } else {
                tempNode = (BinaryCharTree) tempStack.pop();
                tempNode = tempNode.rightChild;
            }
        }
    }

2.后序遍历

结合文章中后序遍历的两种思想,第一种是直接写,第二种是逆向思维,等价替换问题(这个思维很好,学习到了。),由前序遍历:根-左-右,交换左右子树为根-右-左,最后再将其逆序变为左-右-根。 借助两个栈,一个栈和前序中序的存节点出入栈一样,这样保证入栈顺序,另一个栈是将原本需要输入的数据存入栈中(输入顺序为根-右-左),在所有节点遍历完,再将这个存出栈顺序数据的栈打印输出就是以左-右-根输出(将栈先进后出用到极致)

    /**
     * Pre-order visit with stack.
     */
    public void preOrderVisitWithStack() {
        ObjectStack tempStack = new ObjectStack();
        BinaryCharTree tempNode = this;
        while (!tempStack.isEmpty() || tempNode != null) {
            if (tempNode != null) {
                System.out.print("" + tempNode.value + " ");
                tempStack.push(tempNode);
                tempNode = tempNode.leftChild;
            } else {
                tempNode = (BinaryCharTree) tempStack.pop();
                tempNode = tempNode.rightChild;
            }
        }
    }

    /**
     * Post-order visit with stack.
     */
    public void postOrderVisitWithStack() {
        ObjectStack tempStack = new ObjectStack();
        BinaryCharTree tempNode = this;
        ObjectStack tempOutputStack = new ObjectStack();

        while (!tempStack.isEmpty() || tempNode != null) {
            if (tempNode != null) {
                //Store for output.
                tempOutputStack.push(new Character(tempNode.value));
                tempStack.push(tempNode);
                tempNode = tempNode.rightChild;
            } else {
                tempNode = (BinaryCharTree) tempStack.pop();
                tempNode = tempNode.leftChild;
            }
        }

        //Now reverse output.
        while (!tempOutputStack.isEmpty()) {
            System.out.print("" + tempOutputStack.pop() + " ");
        }
    }

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428981.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis第二十八讲 Redis集群脑裂数据丢失问题与集群是否完整才能对外提供服务

集群脑裂数据丢失问题 所谓的脑裂,就是指在主从集群中,同时有两个主节点,它们都能接收写请求。而脑裂最直接的影响,就是客户端不知道应该往哪个主节点写入数据,结果就是不同的客户端会往不同的主节点上写入数据。而且,严重的话,脑裂会进一步导致数据丢失。 redis的集群…

银行数字化转型导师坚鹏:银行业同业竞争策略分析

《银行业同业竞争策略分析》 —数字化背景下银行转型发展创新思维 课程背景&#xff1a; 数字化背景下&#xff0c;很多银行存在以下问题&#xff1a; 不清楚国内领先银行的业务发展现状&#xff1f; 不清楚如何制定竞争策略&#xff1f; 不知道其他银行转型的成功做法&…

Matplotlib学习挑战第六关--散点图、柱形图、饼图

1、Matplotlib 散点图 我们可以使用 pyplot 中的 scatter() 方法来绘制散点图。 scatter() 方法语法格式如下&#xff1a; matplotlib.pyplot.scatter(x, y, sNone, cNone, markerNone, cmapNone,normNone, vminNone, vmaxNone, alphaNone, linewidthsNone, *, edgecolorsNo…

【RabbitMQ】RabbbitMQ的六种工作模式以及代码实现

目录 一、交换机类型 二、简单模式 1、介绍 2、代码实现 三、Work Queues工作队列模式 1、介绍 2、代码实现 四、Pub/Sub订阅模式 1、介绍 2、代码实现 五、Routing路由模式 1、介绍 2、代码实现 六、Topics通配符模式 1、介绍 2、代码实现 一、交换机类型 在…

uniapp开发,打包成H5部署到服务器

前端使用uniapp开发项目完成后&#xff0c;需要将页面打包&#xff0c;生成H5的静态文件&#xff0c;部署在服务器上。 这样通过服务器链接地址&#xff0c;直接可以在手机上点开来访问。 打包全步骤如下&#xff1a; 1、修改config.js内的请求地址 需要后台部署到测试服务器上…

项目进度管理软件的应用可以解决哪些问题

项目管理工具够满足了项目经理对项目资源&#xff1a;时间、人员和文档的管理&#xff0c;同时也提高了项目的可视化和促进了团队的协作。 项目进度管理要求在规定的时间内&#xff0c;通过合理的进度计划&#xff0c;在计划执行过程中&#xff0c;要检查实际进度是否按计划要…

PasteSpider之项目环境-同步过滤-键值配置介绍

项目环境 在菜单项目信息项目环境 中&#xff0c;在PasteSpider中项目->服务->环境&#xff0c;也就是服务是不能运行的&#xff0c;得绑定环境&#xff0c;比如开发环境&#xff0c;测试环境。通过这个概念你可以实现不同得人部署不同的环境&#xff0c;他们之间公用同版…

ChatGPT之父:未训练GPT-5

GPT等大型语言模型带动的芯片需求飙升趋势依然没有平息的迹象&#xff0c;英伟达的最新版旗舰AI芯片H100近日在网上的售价已经被炒到4万多美金&#xff0c;反映了科技行业对训练和部署人工智能软件的需求仍未被满足。 一、商业圈 1.马斯克成立新AI公司硬刚OpenAI 当地时间4月…

大屏开发需要知道哪些知识

大屏 大屏是什么呢&#xff1f;再我前几年刚接触这个词得时候很新颖&#xff0c;全名叫态势感知大屏&#xff0c;大屏得特点是炫酷、好看&#xff0c;给用户满满得科技感。 听一位前辈说当年再招标会上&#xff0c;再都用exel、word做界面图表文档得时候&#xff0c;有一家公司…

使用MyBatis实现条件查询

文章目录一&#xff0c;查询需求二&#xff0c;打开MyBatisDemo项目三&#xff0c;对学生表实现条件查询&#xff08;一&#xff09;创建学生映射器配置文件&#xff08;二&#xff09;在MyBatis配置文件里注册学生映射器配置文件&#xff08;三&#xff09;创建学生映射器接口…

kaggle数据集下载

一、首先需要安装kaggle winR→cmd→pip install kaggle 问题&#xff1a;安装到哪来&#xff1f;都说在c盘。可是我找不到&#xff0c;可能因为之前担心c负荷更改路径了&#xff0c;再安装一下发现已经安装成功&#xff0c;且给出了安装路径。 二、注册 (1387条消息) 最新k…

VS Code 最新 Java 编码体验更新

大家好&#xff0c;欢迎来到我们的三月更新&#xff01;我们将为您带来一系列基础编码体验的改进&#xff0c;例如运行 Java 程序的更流畅体验、AWT 项目相关的代码补全优化以及更好的 Spring Boot 项目与 Azure 的集成&#xff0c;让我们开始吧&#xff01; 运行 Java 程序的用…

开启虚拟机出现报错:“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录报错原因解决方式&#xff08;这里以联…

Python办公自动化之PostgreSQL篇1——PostgreSQL安装(保姆级教程)

我们在办公中会经常用到数据量比较大的表&#xff0c;打开、保存都会相对比较卡顿。那么我们可以安装一个PostgreSQL&#xff0c;然后利用Python进行读取&#xff0c;或者再写入。最后可以将最终的数据表进行导出。 肯定会有小伙伴问&#xff0c;那么利用MySQL不行吗&#xff…

wps宏编辑器-js宏录制运行

WPS开放平台如下描述JS宏录制和运行。 WPS宏编辑器提供了一个自动生成JS代码的功能&#xff0c;即录制宏。录制宏功能通过宏录制器捕捉用户与WPS交互的操作&#xff0c;并以JS代码的形式记录下来&#xff0c;整个过程是自动的&#xff0c;不需要用户写代码。在实际的WPS二次开发…

D. Odd-Even Subsequence(二分 + 奇偶下标的取法)

Problem - D - Codeforces Ashish有一个大小为n的数组a。A的子序列被定义为一个序列&#xff0c;该序列可以通过删除一些元素(可能是不删除)从A中获得&#xff0c;而不改变剩余元素的顺序。考虑a的子序列s。他将s的代价定义为以下两者之间的最小值:在s的奇数指数下所有元素中的…

SAR ADC系列27:实践讲解1

Latch比较器Noise仿真 比较器后面加RS触发器&#xff0c;当比较器复位时&#xff0c;OUTP和OUTN输出为11&#xff0c;RS触发器锁存&#xff1b;当比较器比较时&#xff0c;OUTP和OUTN输出一正一负&#xff0c;RS触发器相当于反相器。 做法&#xff1a;改变Vin的值&#xff0c;…

SAM(Segment Anything Model)让CV走到尽头?学CV的研究生还能正常毕业吗?怎么使用SAM?

SAM&#xff08;Segment Anything Model&#xff09;让CV走到尽头&#xff1f;学CV的研究生还能正常毕业吗&#xff1f;怎么使用SAM&#xff1f; 1. 引言 最近无论是在B站、知乎还是论坛、微博&#xff0c;都看了一些有关SAM的讨论。这个号称“CV界ChatGPT”的模型从出生起就…

x86中断基础

x86中断基础 原文&#xff1a;Basic x86 interrupts 作者&#xff1a;Alex Dzyoba 原文发表日期&#xff1a;2016年4月2日 在我的关于多重引导内核的文章中&#xff0c;我们看到了如何加载内核、打印文本&#xff0c;然后停止。然而要让操作系统可用&#xff0c;需要支持键…

[chapter 26][PyTorch][MNIST 测试实战】

前言 这里面结合手写数字识别的例子&#xff0c;讲解一下训练时候注意点 目录 训练问题解决方案参考代码一 训练问题 训练的时候,我们的数据集分为Train Data 和 validation Data。 随着训练的epoch次数增加&#xff0c;我们发现Train Data 上精度 先逐步增加&#xff0c;但…