Golang实现数的几种遍历
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实现数的几种遍历的更多相关文章
- 大数据学习day13------第三阶段----scala01-----函数式编程。scala以及IDEA的安装,变量的定义,条件表达式,for循环(守卫模式,推导式,可变参数以及三种遍历方式),方法定义,数组以及集合(可变和非可变),数组中常用的方法
		具体见第三阶段scala-day01中的文档(scala编程基础---基础语法) 1. 函数式编程(https://www.cnblogs.com/wchukai/p/5651185.html): ... 
- 《数据结构与算法(C语言版)》严蔚敏 | 第五章 建立二叉树,并完成三/四种遍历算法
		PS:所有的代码示例使用的都是这个图 2019-10-29 利用p126的算法5.3建立二叉树,并完成三种遍历算法 中序 后序 先序 #include<iostream> #include ... 
- 二叉树总结—建树和4种遍历方式(递归&&非递归)
		版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/27967155 今天总结一下二叉树.要考离散了 ... 
- ArrayList哪种遍历效率最好,你真的弄明白了吗?
		ArrayList简介 声明:以下内容都是基于jdk1.8的 ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了 ... 
- HashMap有几种遍历方法?推荐使用哪种?
		本文已收录<面试精选>系列,Gitee 开源地址:https://gitee.com/mydb/interview HashMap 的遍历方法有很多种,不同的 JDK 版本有不同的写法,其 ... 
- java实现二叉树的Node节点定义手撕8种遍历(一遍过)
		java实现二叉树的Node节点定义手撕8种遍历(一遍过) 用java的思想和程序从最基本的怎么将一个int型的数组变成Node树状结构说起,再到递归前序遍历,递归中序遍历,递归后序遍历,非递归前序遍 ... 
- javase-常用三种遍历方法
		javase-常用三种遍历方法 import java.util.ArrayList; import java.util.Iterator; import java.util.List; public ... 
- Java中Map的三种遍历方法
		Map的三种遍历方法: 1. 使用keySet遍历,while循环: 2. 使用entrySet遍历,while循环: 3. 使用for循环遍历. 告诉您们一个小秘密: (下↓面是测试代码,最爱看 ... 
- Map三种遍历方式
		Map三种遍历方式 package decorator; import java.util.Collection; import java.util.HashMap; import java.util ... 
随机推荐
- .NET CORE 依赖注入 实践总结
			知识点回顾 依赖包. Microsoft.Extensions.DependencyInjection.Abstractions 核心对象和方法. IServiceCollection.注入对象的容器 ... 
- MVC案例之多个请求对应一个servlet
			CustomerServlet package com.aff.mvcapp.servlet; import java.io.IOException; import java.lang.reflec ... 
- Rocket - regmapper - RegField
			https://mp.weixin.qq.com/s/7WKB1QxcVzqm2Q7bWcKHzA 简单介绍RegField的实现. 1. 简单介绍 定义寄存器域相关的参数类型. 2. RegFiel ... 
- Rocket - diplomacy - resolveStar
			https://mp.weixin.qq.com/s/W1cS9sgwLFjOOm86d05NIA 介绍各类型节点如何确定星型绑定所包含的连接数. 1. 定义  resoveSta ... 
- jchdl - GSL实例 - MulC2(有符号数的乘法)
			这里的实现,先把符号位取出来,使用两个正数相乘,然后在把符号加到乘积上. 参考链接 https://github.com/wjcdx/jchdl/blob/master/src/org/jch ... 
- 面试题: Java中各个集合类的扩容机制
			个人博客网:https://wushaopei.github.io/ (你想要这里多有) Java 中提供了很多的集合类,包括,collection的子接口list.set,以及map等.由于它 ... 
- Java实现 LeetCode 432 全 O(1) 的数据结构
			432. 全 O(1) 的数据结构 实现一个数据结构支持以下操作: Inc(key) - 插入一个新的值为 1 的 key.或者使一个存在的 key 增加一,保证 key 不为空字符串. Dec(ke ... 
- Java实现 LeetCode 111 二叉树的最小深度
			111. 二叉树的最小深度 给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,nu ... 
- Java实现 LeetCode 89 格雷编码
			89. 格雷编码 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异. 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列.格雷编码序列必须以 0 开头. 示例 1: 输 ... 
- PAT 有理数四则运算
			本题要求编写程序,计算 2 个有理数的和.差.积.商. 输入格式: 输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前 ... 
