package mainimport ( "container/list" "fmt")// Binary Treetype BinaryTree struct { Data interface{} Left *BinaryTree Right *BinaryTree}// Constructorfunc 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())}
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦