PreOrder

recursive

package main

import "fmt"

type TreeNode struct {
val int
Left *TreeNode
Right *TreeNode
} func preorderTraversal(root *TreeNode) {
if root == nil {
return
}
fmt.Println(root.val)
preorderTraversal(root.Left)
preorderTraversal(root.Right)
} func main() {
/*
10
/ \
20 30
/ \ \
40 50 60
/
70
*/ root := &TreeNode{10, nil, nil}
root.Left = &TreeNode{20, nil, nil}
root.Right = &TreeNode{30, nil, nil}
root.Left.Left = &TreeNode{40, nil, nil}
root.Left.Right = &TreeNode{50, nil, nil}
root.Right.Right = &TreeNode{60, nil, nil}
root.Left.Left.Left = &TreeNode{70, nil, nil} fmt.Println("Preorder Traversal - Recursive Solution : ")
preorderTraversal(root)
}

Iterative

package main

import "fmt"

type TreeNode struct {
val int
Left *TreeNode
Right *TreeNode
} func preorderTraversal(root *TreeNode) {
if root == nil {
return
}
stack := make([]*TreeNode, 0) for root != nil || len(stack) != 0 {
for root != nil {
fmt.Println(root.val)
stack = append(stack, root)
root = root.Left
}
v := stack[len(stack)-1]
stack = stack[:len(stack)-1]
root = v.Right
}
} func main() {
/*
10
/ \
20 30
/ \ \
40 50 60
/
70
*/ root := &TreeNode{10, nil, nil}
root.Left = &TreeNode{20, nil, nil}
root.Right = &TreeNode{30, nil, nil}
root.Left.Left = &TreeNode{40, nil, nil}
root.Left.Right = &TreeNode{50, nil, nil}
root.Right.Right = &TreeNode{60, nil, nil}
root.Left.Left.Left = &TreeNode{70, nil, nil} fmt.Println("Preorder Traversal - Iterative Solution : ")
preorderTraversal(root)
}

另一种写法

func preorderTraversal(root *TreeNode) {
if root == nil {
return
}
stack := make([]*TreeNode, 0)
stack = append(stack, root) for len(stack) != 0 {
node := stack[len(stack)-1]
stack = stack[:len(stack)-1]
fmt.Println(node.val) if node.Right != nil {
stack = append(stack, node.Right)
}
if node.Left != nil {
stack = append(stack, node.Left)
}
}
}

InOrder

Iterative

func inorderTraverse(root *TreeNode) {
if root == nil {
return
}
stack := make([]*TreeNode, 0) for root != nil || len(stack) != 0 {
for root != nil {
stack = append(stack, root)
root = root.Left
}
node := stack[len(stack)-1]
stack = stack[:len(stack)-1]
fmt.Println(node.val)
root = node.Right
}
}

PostOrder

Iterative

func postorderTraversal(root *TreeNode) {
if root == nil {
return
}
stack := make([]*TreeNode, 0)
var lastNode *TreeNode for root != nil || len(stack) != 0 {
for root != nil {
stack = append(stack, root)
root = root.Left
}
node := stack[len(stack)-1]
if node.Right == nil || node.Right == lastNode {
stack = stack[:len(stack)-1]
lastNode = node
fmt.Println(node.val)
} else {
root = node.Right
}
}
}

Golang实现数的几种遍历的更多相关文章

  1. 大数据学习day13------第三阶段----scala01-----函数式编程。scala以及IDEA的安装,变量的定义,条件表达式,for循环(守卫模式,推导式,可变参数以及三种遍历方式),方法定义,数组以及集合(可变和非可变),数组中常用的方法

    具体见第三阶段scala-day01中的文档(scala编程基础---基础语法)  1. 函数式编程(https://www.cnblogs.com/wchukai/p/5651185.html): ...

  2. 《数据结构与算法(C语言版)》严蔚敏 | 第五章 建立二叉树,并完成三/四种遍历算法

    PS:所有的代码示例使用的都是这个图 2019-10-29 利用p126的算法5.3建立二叉树,并完成三种遍历算法 中序 后序 先序 #include<iostream> #include ...

  3. 二叉树总结—建树和4种遍历方式(递归&&非递归)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/27967155 今天总结一下二叉树.要考离散了 ...

  4. ArrayList哪种遍历效率最好,你真的弄明白了吗?

    ArrayList简介 声明:以下内容都是基于jdk1.8的 ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了 ...

  5. HashMap有几种遍历方法?推荐使用哪种?

    本文已收录<面试精选>系列,Gitee 开源地址:https://gitee.com/mydb/interview HashMap 的遍历方法有很多种,不同的 JDK 版本有不同的写法,其 ...

  6. java实现二叉树的Node节点定义手撕8种遍历(一遍过)

    java实现二叉树的Node节点定义手撕8种遍历(一遍过) 用java的思想和程序从最基本的怎么将一个int型的数组变成Node树状结构说起,再到递归前序遍历,递归中序遍历,递归后序遍历,非递归前序遍 ...

  7. javase-常用三种遍历方法

    javase-常用三种遍历方法 import java.util.ArrayList; import java.util.Iterator; import java.util.List; public ...

  8. Java中Map的三种遍历方法

    Map的三种遍历方法: 1. 使用keySet遍历,while循环: 2. 使用entrySet遍历,while循环: 3. 使用for循环遍历.   告诉您们一个小秘密: (下↓面是测试代码,最爱看 ...

  9. Map三种遍历方式

    Map三种遍历方式 package decorator; import java.util.Collection; import java.util.HashMap; import java.util ...

随机推荐

  1. web自动化之浏览器的窗口切换

    from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from seleni ...

  2. MVC案例

    MVC案例分析: - 没有业务层,直接Servlet调用Dao,所以也没有业务操作.所有在DAO直接获取Connection对象 -采用MVCDs设计模式 -使用到的技术: mvc设计模式:JSP  ...

  3. 爱奇艺|B站|优酷|腾讯视频高清无水印视频下载方法(软件工具教程)

    导读:经常在大型视频网站平台上看到一些很价值和视频,希望能高清无水印下载到本地学习观看,今天小程序定制开发代码哥DaiMaGe6给大家分享一招免费下载全网高清无水印视频的方法. 高清无水印视频下载工具 ...

  4. Rocket - debug - TLDebugModuleInner - HARTINFO

    https://mp.weixin.qq.com/s/9GjZAax0SZhRqLne16jn-w 简单介绍TLDebugModuleInner中HARTINFO寄存器的实现. 1. HARTINFO ...

  5. Rocket - diplomacy - AddressAdjuster分析

    https://mp.weixin.qq.com/s/UYVSO3XFJmhe5bUD_XbMLg   先介绍如何使用AddressAdjuster,然后分析UI参数的生成及使用.   ​​   1. ...

  6. A barrier for Mobile Forensics - Samsung Secure Folder

    Since I mentioned about "Second Space", let's take a look at Samsung "Secure Folder&q ...

  7. 【Flume】知识总结

    Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理,并 ...

  8. 使用turtle库画太极图

    from turtle import * pensize(3) penup() pencolor("black") reset() speed(10) pendown() circ ...

  9. Java实现 蓝桥杯 算法提高 快乐司机

    算法提高 快乐司机 时间限制:1.0s 内存限制:256.0MB 问题描述 "嘟嘟嘟嘟嘟嘟 喇叭响 我是汽车小司机 我是小司机 我为祖国运输忙 运输忙" 这是儿歌"快乐的 ...

  10. Java实现 LeetCode 235 二叉搜索树的最近公共祖先

    235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个 ...