美文网首页golang进阶之路
Golang算法:二叉树前序,中序,后序非递归遍历算法

Golang算法:二叉树前序,中序,后序非递归遍历算法

作者: 不屈真实 | 来源:发表于2020-06-22 10:45 被阅读0次

    本文主要介绍了二叉树前序,中序,后序非递归遍历算法

    import (
       "container/list"
    )
    // 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())
    }
    

    相关文章

      网友评论

        本文标题:Golang算法:二叉树前序,中序,后序非递归遍历算法

        本文链接:https://www.haomeiwen.com/subject/ytcxfktx.html