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 ...
随机推荐
- Java-KTVByLinkedList模拟点歌工具
import java.util.LinkedList; import java.util.Scanner; public class KTVByLinkedList { public static ...
- pytest之fixture使用详解
简介: fixture区别于unnitest的传统单元测试(setup/teardown)有显著改进: 1.有独立的命名,并通过声明它们从测试函数.模块.类或整个项目中的使用来激活. 2.按模块化的方 ...
- Unity 游戏框架搭建 2019 (四十八/四十九) MonoBehaviourSimplify 中的消息策略完善&关于发送事件的简单封装
MonoBehaviourSimplify 中的消息策略完善 在上一篇,笔者说,MonoBehaviourSimplify 中的消息策略还有一些小问题.我们在这篇试着解决一下. 先贴出来代码: usi ...
- 使用PRTG和panabit结合定位网络阻塞的来源
一.背景 在网络管理工作中,有时会出现网络阻塞,需要定位阻塞来源以采取措施解决问题.二.以一个网络阻塞案例说明定位方法 案例:某企业日常使用多条网络线路,某一段时间发现某条线路传输速率下降,对 ...
- rewrite和return的简单需求
Rewrite 需求作业 背景:现在我有一个网站,www.linux.com www.linux.com访问主页面 friend.linux.com访问交友页面 blog.linux.com访问博客页 ...
- 面试官问我会不会Elasticsearch,我语塞了...
少点代码,多点头发 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues. https://github.com/midou-tech/articles 从今天开始准备给大家带来全新 ...
- Java实现 LeetCode 516 最长回文子序列
516. 最长回文子序列 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 示例 1: 输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 ...
- Java实现 蓝桥杯VIP 算法提高 产生数
算法提高 产生数 时间限制:1.0s 内存限制:256.0MB 问题描述 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则: 一位数可变换成另一个一位数: 规则 ...
- Android中如何使用Listview
第一步 首先在xml文件中声明一个List View控件,并且标明id (这一步其实不用说,怕自学Android的小白不懂,就好比当初的我,哈哈) <?xml version="1.0 ...
- Java实现 洛谷 P1618 三连击(升级版)
import java.util.Arrays; import java.util.Scanner; public class Main { private static Scanner cin; p ...