二叉树的前中后序遍历

015、架构_配置文件_管理节点(proxymanager.ini) 该配置文件中的参数在后台配置,两种生效方式:*所有参数重启生效。*部分参数可以使用工具dbtool动态生效。动态生效命令为:dbtool-pm-load-config。配置文件“proxymanager.ini”用于设置元数据管理模块的信息。文件路径为“~/etc”。配置文件“proxymanager.ini”是普通的文本文件。默认值proxymanager-alarmconfutf8.txt。配置错误或不配置,PM无法连接MDS,无法服务。获取元数据失败超时处理时间。异常时请求启动对等回滚。 阅读详情

下面代码实现了二叉树的前中后序遍历,包括递归和非递归版本:

package tree;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;

/**
 * Created by International on 2018/4/26.
 */
public class BinaryTree {
    public static void main(String[] args) {
        TreeNode d = new TreeNode("D");
        TreeNode e = new TreeNode("E");
        TreeNode f = new TreeNode("F");

        TreeNode b = new TreeNode("B", null, d);
        TreeNode c = new TreeNode("C", e, f);

        TreeNode a = new TreeNode("A", b, c);

        List<TreeNode> result = new ArrayList<>();

        /*
         * 递归方法完成前、中、后序遍历
         */
//        preTraverse(a, result);
//        inTraverse(a, result);
//        postTraverse(a, result);

        /*
         * 非递归方法完成前、中、后序遍历
         */
//        preTraverse1(a, result);
//        inTraverse1(a, result);
//        postTraverse1(a, result);

        printResult(result);
    }

    private static void printResult(List<TreeNode> result) {
        for (int i = 0; i < result.size(); i++) {
            if (i == 0) {
                System.out.print(result.get(i).val);
            } else {
                System.out.print(" --> " + result.get(i).val);
            }
        }
    }

    public static void preTraverse(TreeNode node, List<TreeNode> result) {
        if (node == null) {
            return ;
        }
//        System.out.print(node.val);
        result.add(node);
        preTraverse(node.left, result);
        preTraverse(node.right, result);
    }

    public static void inTraverse(TreeNode node, List<TreeNode> result) {
        if (node == null) {
            return ;
        }
        inTraverse(node.left, result);
//        System.out.println(node.val);
        result.add(node);
        inTraverse(node.right, result);
    }

    public static void postTraverse(TreeNode node, List<TreeNode> result) {
        if (node == null) {
            return ;
        }
        postTraverse(node.left, result);
        postTraverse(node.right, result);
        result.add(node);
    }


    private static void preTraverse1(TreeNode node, List<TreeNode> result) {
        if (node == null) {
            return;
        }
        Deque<Guide> deque = new ArrayDeque<>();
        deque.push(new Guide(0, node));
        while (! deque.isEmpty()) {
            Guide guide = deque.pop();
            TreeNode treeNode = guide.node;
            if (guide.opt == 0) {
                if (treeNode.right != null) {
                    deque.push(new Guide(0, treeNode.right));
                }
                if (treeNode.left != null) {
                    deque.push(new Guide(0, treeNode.left));
                }
                deque.push(new Guide(1, treeNode));
            } else if (guide.opt == 1) {
                result.add(treeNode);
            }
        }
    }

    public static void inTraverse1(TreeNode node, List<TreeNode> result) {
        if (node == null) {
            return;
        }
        Deque<Guide> deque = new ArrayDeque<>();
        deque.push(new Guide(0, node));
        while (!deque.isEmpty()) {
            Guide guide = deque.pop();
            TreeNode treeNode = guide.node;
            if (guide.opt == 0) {
                if (treeNode.right != null) {
                    deque.push(new Guide(0, treeNode.right));
                }
                deque.push(new Guide(1, treeNode));
                if (treeNode.left != null) {
                    deque.push(new Guide(0, treeNode.left));
                }
            } else if (guide.opt == 1) {
                result.add(treeNode);
            }
        }
    }

    public static void postTraverse1(TreeNode node, List<TreeNode> result) {
        if (node == null) {
            return ;
        }
        Deque<Guide> deque = new ArrayDeque<>();
        deque.push(new Guide(0, node));
        while (!deque.isEmpty()) {
            Guide guide = deque.pop();
            TreeNode treeNode = guide.node;
            if (guide.opt == 0) {
                deque.push(new Guide(1, treeNode));
                if (treeNode.right != null) {
                    deque.push(new Guide(0, treeNode.right));
                }
                if (treeNode.left != null) {
                    deque.push(new Guide(0, treeNode.left));
                }
            } else if (guide.opt == 1) {
                result.add(treeNode);
            }
        }
    }

}

class Guide {
    int opt; // 0-visit; 1-print
    TreeNode node;

    public Guide(int opt, TreeNode node) {
        this.opt = opt;
        this.node = node;
    }
}

class TreeNode {
    String val;
    TreeNode left;
    TreeNode right;

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

    public TreeNode(String val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}
package binaryTree;

import java.util.*;

/*
 * 二叉树的递归与非递归版本,下面的版本中,非递归版本不如上面的清晰,上面版本通过构造一个任务类,将任务类压入、弹出栈完成遍历,不仅更清晰,也更简单。
 */
public class Traverse {
	//递归版本
	public static void preTraverse(TreeNode node) {
		if(node == null) 
			return;
		
		System.out.println(node.value);//或其他操作
		
		preTraverse(node.left);
		preTraverse(node.right);
	}
	
	public static void inTraverse(TreeNode node) {
		if(node == null)
			return;
		
		inTraverse(node.left);
		
		System.out.println(node.value);//或其他操作
		
		inTraverse(node.right);
	}
	
	public static void postTraverse(TreeNode node) {
		if(node == null)
			return;
		
		postTraverse(node.left);
		postTraverse(node.right);
		
		System.out.println(node.value);//或其他操作
	}
	
	//非递归版本
	public static void rePreTraverse(TreeNode node) {
		if(node == null)
			return;
		
		Stack<TreeNode> stack = new Stack<TreeNode>();
		stack.push(node);
		while(!stack.isEmpty()) {
			TreeNode tmp = stack.pop();
			System.out.println(tmp.value);//或其他操作
			
			if(tmp.right != null)
				stack.push(tmp.right);
			if(tmp.left != null)
				stack.push(tmp.left);
		}
	}
	
	public static void reInTraverse(TreeNode node) {
		if(node == null)
			return;
		
		Stack<TreeNode> stack = new Stack<TreeNode>();
		while(node != null || !stack.isEmpty()) {
			if(node != null) {
				stack.push(node);
				node = node.left;
			} else {
				node = stack.pop();
				
				System.out.println(node.value);//或其他操作
				
				node = node.right;
			}
		}
	}
	
	public static void rePostTraverse(TreeNode node) {
		 Stack<TreeNode> s = new Stack<TreeNode>();
		  TreeNode p = node;
		  //pre标记最近出栈的节点,用于判断是否是p节点的右孩子,如果是的话,就可以访问p节点
		  TreeNode pre = p;
		  //flag标记是出栈还是继续将左孩子进栈:true标记进栈;false标记出栈;
		  boolean flag = true;
		  while(p!=null || !s.isEmpty()) {
			  if(p!=null && flag) {
				  s.push(p);
				  p = p.left;
			  }
			  else {
				  if(s.isEmpty()) return;
				  p = s.peek();
				  if(p.right != null && p.right!=pre) {
					  p = p.right;
					  flag = true;
				  }
				  else {
					  p = s.pop();
					  System.out.println(p.value);
					  flag = false;
					  pre = p;
				  }
			  }
		 }
	}
}


大中型超市收银系统(可直接运行) 光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开 立即下载

相关推荐

STM32CubeMX和华为LiteOS Studio开发STM32

传统的STM32的开发通常使用Keil/IAR这类开发软件,随着物联网时代的到来,传统嵌入式的发展不断向物联网方向靠拢,而Keil/IAR这类开发软件无法满足IoT一站式的开发,华为LiteOS Studio结合STM32CubeMX可以快速,高效地进行物联网开发,本文提供一种开发思路及环境的配置方法。...

weixin_45680600的博客 2833

关于二叉树前中后序遍历的常见问题

尊敬的读者您好:笔者很高兴自己的文章能被阅读,但原创与编辑均不易,所以转载请必须注明本文出处并附上本文地址超链接以及博主博客地址:https://blog.youkuaiyun.com/vensmallzeng。若觉得本文对您有益处还请帮忙点个赞鼓励一下,笔者在此感谢每一位读者,如需联系笔者,请记下邮箱:zengzenghe@gmail.com,谢谢合作! 最近不论是笔试还是面试,都经常性...

Vensmallzeng的博客 4646

RAG——从0到1快速搭建RAG应用

本文介绍了基于LangChain框架构建RAG(检索增强生成)应用的技术方案,涵盖核心模块选型与实现流程。技术栈包括:LangChain应用框架、pypdf文档解析、RecursiveCharacterTextSplitter文本分块、bge-small-zh-v1.5向量模型、Faiss向量库和通义千问大模型。文章详细说明了开发环境配置步骤,包括虚拟环境创建、依赖库安装和模型下载。核心代码分为索引、检索、生成三大流程,索引流程完成PDF文档解析、分块和向量化存储;检索流程实现查询向量化和相似度匹配;生成流

小志的博客 596

二叉树的前,中,后序遍历实现

本文将使用c语言实现二叉树的前中后序遍历,并给出leetcode的相关题解。

wdhykj1的博客 1368

对E-R模型向关系模式转换的认识

一:基本E-R图的转换 1     属性处理 派生属性:直接忽略。 复合属性:展平技术。 多值属性:单独建立一个关系表,关系名就是多值属性名,如果是实体集的多值属性,关系的属性就是实体集的码加上多值属性,如果是联系集的多值属性,关系的属性就是各个实体集的码加上多值属性,关系的码要具体情况具体分析。 2     基本E-R图转换为关系模式 强实体集:一个关系,关系名就是强实体集名,关系属

优快云_LYY的专栏 2734

绿盾注册机 使用手册

在很多涉及工程设计的单位(如建筑、模具、电路、广告等),电子图纸的应用极为普遍,而电子图纸的丢失、被盗对企业利益的影响是显而易见的,如果被竞争对手获取,甚至可能造成致命的打击。因此,对于这类企业,电子图纸的保密显得至关重要。绿盾信息安全管理软件充分考虑了电子图纸的各种可能传播途径,制定了针对性的解决方案,从而保证了电子图纸的安全。 我们总结了电子图纸的各种传播途径以及相应的对策,有如下几点:

998

【数据结构】二叉树的前中后序遍历以及层序遍历(全解)

二叉树的前中后序遍历以及层序遍历讲解

2301_80191662的博客 2138

STM32项目分享:智能家居语音系统

(资料分享见文末)基于STM32的智能家居语音系统温湿度采集:系统通过DHT11模块采集温湿度烟雾监测:通过MQ-2模块采集环境中烟雾浓度光照强度采集:通过BH1750传感器采集环境光照强度窗帘控制:通过步进电机转动模拟窗帘控制风扇控制:通过继电器和指示灯模拟风扇驱动照明控制:通过继电器和指示灯模拟照明驱动蜂鸣器报警:环境烟雾异常情况下蜂鸣器报警OLED显示:显示温湿度、光照强度和烟雾浓度APP功能:使用机智云APP,包括功能有控制照明灯和风扇开关、显示当前温湿度信息。

qq_44016222的博客 4147

二叉树(前中后序遍历,查找,删除)

二叉树的遍历   1. 前中后序遍历    二叉树的前序遍历(根节点最先遍历):    中序遍历    二叉树的后续遍历:    小结:   2.二叉树的前中后续查找:    2.1二叉树的前序查找:    2.2二叉树的中序查找:    2.2二叉树的后续查找:   3 二叉树节点删除操作:   完成删除结点的操作   思路   步骤:

2301_80062351的博客 1916

Isaac Sim 车辆动力学:从参数调优到户外仿真的挑战与实战

本文深入探讨了Isaac Sim在车辆动力学仿真中的应用,从参数调优到户外场景模拟的实战经验。详细解析了悬架系统、轮胎物理模型等核心参数的设置技巧,并分享了应对户外仿真挑战的实用方案。通过Vehicle Wizard高级使用和传感器配置,帮助开发者高效完成车辆仿真与算法开发。

weixin_29192211的博客 404

手把手教你学Simulink——基于AI融合与智能调度的场实例:强化学习在卫星资源分配中的应用

本文详细介绍了如何利用Simulink和强化学习技术实现智能卫星资源分配。文章首先分析了低轨卫星通信系统面临的动态资源调度挑战,提出采用强化学习(特别是PPO算法)的解决方案。接着逐步展示了完整的建模过程:从Simulink项目创建、卫星通信环境建模(用户业务、信道特性、资源池),到强化学习任务定义(状态空间、动作空间、奖励函数),再到PPO智能体的构建与训练。最后通过仿真验证,PPO智能体在系统吞吐量、公平性和阻塞率等关键指标上均优于传统方法。该方案为卫星通信系统的智能资源管理提供了可行方案,并支持进一步

MHD0815的博客 190

【 二叉树前中后序遍历】

对于所有的深度遍历来说,都是从根节点出发,左子树遍历完毕后,再遍历右子树;

qq_43479628的博客 457

4.Simulink基础建模操作——加减乘除运算

加减乘除运算

FPGA/MATLAB学习教程/源码/项目合作开发 9551

二叉树的前中后序遍历——leetcode94、144、145

在解决二叉树的前中后序遍历的时候,首要了解的是前中后序指的是根节点在哪被遍历,了解了这个想法,其实使用递归的方法就很好解决这几个题目了。我认为最关键的还是要想到如何在遍历完左子树或者右子树时再回到根节点,不然无法保证顺序!给定一个二叉树的根节点 root ,返回 它的 中序 遍历。进阶: 递归算法很简单,你可以通过迭代算法完成吗?想到的解法不是很好,没有正面的解决根节点位置的问题。输入:root = [1,null,2,3]输入:root = [1]输入:root = []输出:[1,3,2]

m0_46860258的博客 866

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

二叉树的前中后序遍历及层次遍历

二叉树的前中后序遍历非递归实现及层次遍历队列实现 - 没有对象也没有new方法的大白 - 优快云博客 二叉树遍历(前序、中序、后序、层次、深度优先)递归和非递归 java实现 - 维 - 优快云博客 递归像剥洋葱,假设我们剥了一层皮后还要洗干净这层皮,这一步才算完成,那么我们在剥完一次皮后,本来按步骤要去洗的,但剥完发现还有一层皮要剥,于是我们就先不洗了,而是立马把新出现的皮给剥了...

Iris的博客 815

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【数据结构】二叉树——前中后序遍历

所谓的前中后序遍历其实就是我们访问二叉树时读取数据的顺序我们在访问数据时我们可以选择将该节点的数据取出来,或者接着向下遍历,我们取出节点数据在遍历过程的顺序就是前中后序我们先手搓一个如上图的二叉树。

2302_79968411的博客 1538

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

二叉树的前、中、后序遍历

所谓二叉树遍历是按某种特定规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,也是二叉树进行其它运算的基础。二叉树的遍历有:前序/中序/后序的递归结构遍历:1. 前序遍历(先根遍历)——访问根结点的操作发生在遍历其左右子树之前(根->左子树->右子树)。2. 中序遍历(中根遍历)——访问根结点的操作发生在遍历其左右子树之中(左子树->根->右子树)。3. 后序遍历(后根遍历)——访问根结点的操作发生在遍历其左右子树之后(

ll1175555的博客 1万+

JavaScript实现二叉树前中后序遍历,面试几个月还没找到工作

/ 结点是空的,直接返回if (!

m0_57473261的博客 965

每日算法-二叉树前中后序遍历

本文系统介绍了二叉树的遍历方法,包括前序、中序和后序遍历。首先阐述了二叉树的基本概念和Java实现,然后详细解析了三种遍历方式的本质区别和访问顺序。文章提供了递归和迭代两种实现方式:递归实现简洁直观但易栈溢出;迭代实现通过手动管理栈模拟递归过程,更适合大规模数据。每种遍历方式都给出了清晰的Java代码示例,并分析了优缺点,帮助读者全面掌握二叉树遍历技术及其应用场景。

qq_844085127的博客 1370

二叉树的前中后序遍历的递归写法

文章目录一、递归算法的三段论?二、运用步骤【以前序遍历为例】总结 一、递归算法的三段论? 1、确定递归函数的参数和返回值 【确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。】 2、确定终止条件 【写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。】 3、确定单层递归的逻辑 【确.

weixin_46269257的博客 738

【二叉树进阶】--- 前中后序遍历非递归

当我们还面临一个问题当取到左路结点的右子树时,我们需要想办法标记判断右子树是否已经访问过了,如果访问过就直接访问根,没有访问过就访问右子树。中序是对左路结点时不能先访问,而是先依次入栈,入栈完左路结点后再访问这些左路结点,再依次访问他们各自的右子树。后序跟前序的思路也是完全一致,毕竟模拟的是递归展开过程,只不过后序是左子树-右子树-根,最后再访问根结点,也就是说要左右子树都访问完之后才能访问根并出栈。3.如果左路节点右子树不为空,右子树已经访问过,那么上一个访问节点应该是右子树的根,

2301_79448270的博客 1483

1分钟学会二叉树前,中,后序遍历,错过后悔

1分钟学会二叉树前,中,后序遍历,错过后悔

学习、分享、成长。 1432

【二叉树遍历 Java版】二叉树的前中后序遍历and层次遍历

所谓深度遍历,即一个节点下面有子树的话,先遍历左子树(如果有)再遍历右子树(如果有),子树遍历完了,加上这个节点(根据前中后序遍历实际情况考虑这个节点是什么时候访问),这棵树遍历完了,再往上走,回到其父节点……这里有个很有意思的点,前序遍历是中-左-右,前序遍历的过程中,如果交换左右子树的遍历顺序,变成中-右-左,然后再reverse反转一下,变成左-右-中,即为后序遍历了。遇到一个节点,先遍历其左子树,左子树遍历完了,再遍历这个节点,然后再遍历这个树的右子树,这就是中序遍历的顺序。

massive_jiang的博客 1374

二叉树前中后序遍历(非递归),搜索二叉树迭代器

二叉树前中后序遍历(非递归) 递归方式在这就不列举了,这里使用栈的方式来进行前中后序遍历二叉树。 前,中序遍历 中序:使用一个栈,从根节点出发, 1.将左节点压入栈中,head = head,left继续迭代,不断迭代直到左节点为空。 2.然后将stack栈顶元素pop出来存在head中,打印head, 3.将head = head.right,重复以上1,2。 写出的代码如下: public List<Integer> inorderTraversal(TreeNode root) {

u012345683的博客 3374
上一篇: 【JAVA/读书随笔】网络
下一篇: 欢迎使用优快云-markdown编辑器
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值