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. Java-KTVByLinkedList模拟点歌工具

    import java.util.LinkedList; import java.util.Scanner; public class KTVByLinkedList { public static ...

  2. pytest之fixture使用详解

    简介: fixture区别于unnitest的传统单元测试(setup/teardown)有显著改进: 1.有独立的命名,并通过声明它们从测试函数.模块.类或整个项目中的使用来激活. 2.按模块化的方 ...

  3. Unity 游戏框架搭建 2019 (四十八/四十九) MonoBehaviourSimplify 中的消息策略完善&关于发送事件的简单封装

    MonoBehaviourSimplify 中的消息策略完善 在上一篇,笔者说,MonoBehaviourSimplify 中的消息策略还有一些小问题.我们在这篇试着解决一下. 先贴出来代码: usi ...

  4. 使用PRTG和panabit结合定位网络阻塞的来源

    一.背景   在网络管理工作中,有时会出现网络阻塞,需要定位阻塞来源以采取措施解决问题.二.以一个网络阻塞案例说明定位方法   案例:某企业日常使用多条网络线路,某一段时间发现某条线路传输速率下降,对 ...

  5. rewrite和return的简单需求

    Rewrite 需求作业 背景:现在我有一个网站,www.linux.com www.linux.com访问主页面 friend.linux.com访问交友页面 blog.linux.com访问博客页 ...

  6. 面试官问我会不会Elasticsearch,我语塞了...

    少点代码,多点头发 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues. https://github.com/midou-tech/articles 从今天开始准备给大家带来全新 ...

  7. Java实现 LeetCode 516 最长回文子序列

    516. 最长回文子序列 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 示例 1: 输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 ...

  8. Java实现 蓝桥杯VIP 算法提高 产生数

    算法提高 产生数 时间限制:1.0s 内存限制:256.0MB 问题描述 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则: 一位数可变换成另一个一位数: 规则 ...

  9. Android中如何使用Listview

    第一步 首先在xml文件中声明一个List View控件,并且标明id (这一步其实不用说,怕自学Android的小白不懂,就好比当初的我,哈哈) <?xml version="1.0 ...

  10. Java实现 洛谷 P1618 三连击(升级版)

    import java.util.Arrays; import java.util.Scanner; public class Main { private static Scanner cin; p ...