分享
golang二叉树前序,中序,后序非递归遍历算法
暮色伊人 · · 3888 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
package main
import (
"container/list"
"fmt"
)
// Binary Tree
type BinaryTree struct {
Data interface{}
Left *BinaryTree
Right *BinaryTree
}
// Constructor
func NewBinaryTree(data interface{}) *BinaryTree {
return &BinaryTree{Data: data}
}
// 先序遍历-非递归
func (bt *BinaryTree) PreOrderNoRecursion() []interface{} {
t := bt
stack := list.New()
res := make([]interface{}, 0)
for t != nil || stack.Len() != 0 {
for t != nil {
res = append(res, t.Data)//visit
stack.PushBack(t)
t = t.Left
}
if stack.Len() != 0 {
v := stack.Back()
t = v.Value.(*BinaryTree)
t = t.Right
stack.Remove(v)
}
}
return res
}
// 中序遍历-非递归
func (bt *BinaryTree) InOrderNoRecursion() []interface{} {
t := bt
stack := list.New()
res := make([]interface{}, 0)
for t != nil || stack.Len() != 0 {
for t != nil {
stack.PushBack(t)
t = t.Left
}
if stack.Len() != 0 {
v := stack.Back()
t = v.Value.(*BinaryTree)
res = append(res, t.Data)//visit
t = t.Right
stack.Remove(v)
}
}
return res
}
// 后序遍历-非递归
func (bt *BinaryTree) PostOrderNoRecursion() []interface{} {
t := bt
stack := list.New()
res := make([]interface{}, 0)
var preVisited *BinaryTree
for t != nil || stack.Len() != 0 {
for t != nil {
stack.PushBack(t)
t = t.Left
}
v := stack.Back()
top := v.Value.(*BinaryTree)
if (top.Left == nil && top.Right == nil) || (top.Right == nil && preVisited == top.Left) || preVisited == top.Right{
res = append(res, top.Data)//visit
preVisited = top
stack.Remove(v)
}else {
t = top.Right
}
}
return res
}
func main() {
t := NewBinaryTree(1)
t.Left = NewBinaryTree(3)
t.Right = NewBinaryTree(6)
t.Left.Left = NewBinaryTree(4)
t.Left.Right = NewBinaryTree(5)
t.Left.Left.Left = NewBinaryTree(7)
fmt.Println(t.PreOrderNoRecursion())
fmt.Println(t.InOrderNoRecursion())
fmt.Println(t.PostOrderNoRecursion())
}有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信3888 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
package main
import (
"container/list"
"fmt"
)
// Binary Tree
type BinaryTree struct {
Data interface{}
Left *BinaryTree
Right *BinaryTree
}
// Constructor
func NewBinaryTree(data interface{}) *BinaryTree {
return &BinaryTree{Data: data}
}
// 先序遍历-非递归
func (bt *BinaryTree) PreOrderNoRecursion() []interface{} {
t := bt
stack := list.New()
res := make([]interface{}, 0)
for t != nil || stack.Len() != 0 {
for t != nil {
res = append(res, t.Data)//visit
stack.PushBack(t)
t = t.Left
}
if stack.Len() != 0 {
v := stack.Back()
t = v.Value.(*BinaryTree)
t = t.Right
stack.Remove(v)
}
}
return res
}
// 中序遍历-非递归
func (bt *BinaryTree) InOrderNoRecursion() []interface{} {
t := bt
stack := list.New()
res := make([]interface{}, 0)
for t != nil || stack.Len() != 0 {
for t != nil {
stack.PushBack(t)
t = t.Left
}
if stack.Len() != 0 {
v := stack.Back()
t = v.Value.(*BinaryTree)
res = append(res, t.Data)//visit
t = t.Right
stack.Remove(v)
}
}
return res
}
// 后序遍历-非递归
func (bt *BinaryTree) PostOrderNoRecursion() []interface{} {
t := bt
stack := list.New()
res := make([]interface{}, 0)
var preVisited *BinaryTree
for t != nil || stack.Len() != 0 {
for t != nil {
stack.PushBack(t)
t = t.Left
}
v := stack.Back()
top := v.Value.(*BinaryTree)
if (top.Left == nil && top.Right == nil) || (top.Right == nil && preVisited == top.Left) || preVisited == top.Right{
res = append(res, top.Data)//visit
preVisited = top
stack.Remove(v)
}else {
t = top.Right
}
}
return res
}
func main() {
t := NewBinaryTree(1)
t.Left = NewBinaryTree(3)
t.Right = NewBinaryTree(6)
t.Left.Left = NewBinaryTree(4)
t.Left.Right = NewBinaryTree(5)
t.Left.Left.Left = NewBinaryTree(7)
fmt.Println(t.PreOrderNoRecursion())
fmt.Println(t.InOrderNoRecursion())
fmt.Println(t.PostOrderNoRecursion())
}