golang二叉树遍历方法

发布时间:2024-07-05 01:28:45

Go语言是一门强大的编程语言,它简洁优雅、高效可靠,被广泛应用于各个领域。在Go语言的标准库中提供了丰富的数据结构和算法支持,其中包括二叉树的遍历方法。本文将介绍如何使用Go语言实现二叉树的前序、中序和后序遍历,并解析其原理和应用。

前序遍历

前序遍历是二叉树遍历的一种方式,它的顺序是先访问根节点,再访问左子树,最后访问右子树。我们可以通过递归或者迭代的方式来实现前序遍历。

递归实现前序遍历的代码如下:

func PreOrderTraverse(root *TreeNode) {
    if root == nil {
        return
    }

    // 访问根节点
    fmt.Println(root.Val)

    // 遍历左子树
    PreOrderTraverse(root.Left)

    // 遍历右子树
    PreOrderTraverse(root.Right)
}

迭代实现前序遍历的代码如下:

func PreOrderTraverse(root *TreeNode) {
    if root == nil {
        return
    }
  
    stack := []*TreeNode{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)
        }
    }
}

中序遍历

中序遍历是二叉树遍历的一种方式,它的顺序是先访问左子树,再访问根节点,最后访问右子树。同样,我们可以使用递归或者迭代的方法来实现中序遍历。

递归实现中序遍历的代码如下:

func InOrderTraverse(root *TreeNode) {
    if root == nil {
        return
    }
  
    // 遍历左子树
    InOrderTraverse(root.Left)
  
    // 访问根节点
    fmt.Println(root.Val)
  
    // 遍历右子树
    InOrderTraverse(root.Right)
}

迭代实现中序遍历的代码如下:

func InOrderTraverse(root *TreeNode) {
    if root == nil {
        return
    }
  
    stack := []*TreeNode{}
    node := root
  
    for node != nil || len(stack) > 0 {
        // 将左子节点入栈
        for node != nil {
            stack = append(stack, node)
            node = node.Left
        }
      
        // 访问当前节点
        node = stack[len(stack)-1]
        stack = stack[:len(stack)-1]
        fmt.Println(node.Val)
      
        // 遍历右子树
        node = node.Right
    }
}

后序遍历

后序遍历是二叉树遍历的一种方式,它的顺序是先访问左子树,再访问右子树,最后访问根节点。同样,我们可以使用递归或者迭代的方法来实现后序遍历。

递归实现后序遍历的代码如下:

func PostOrderTraverse(root *TreeNode) {
    if root == nil {
        return
    }
  
    // 遍历左子树
    PostOrderTraverse(root.Left)
  
    // 遍历右子树
    PostOrderTraverse(root.Right)
  
    // 访问根节点
    fmt.Println(root.Val)
}

迭代实现后序遍历的代码比较复杂,可以使用两个栈来辅助实现。具体代码如下:

func PostOrderTraverse(root *TreeNode) {
    if root == nil {
        return
    }
  
    stack1 := []*TreeNode{root}
    stack2 := []*TreeNode{}
  
    for len(stack1) > 0 {
        node := stack1[len(stack1)-1]
        stack1 = stack1[:len(stack1)-1]
      
        // 将当前节点放入第二个栈中
        stack2 = append(stack2, node)
      
        // 先将左子节点放入第一个栈中
        if node.Left != nil {
            stack1 = append(stack1, node.Left)
        }
      
        // 再将右子节点放入第一个栈中
        if node.Right != nil {
            stack1 = append(stack1, node.Right)
        }
    }
  
    // 打印第二个栈中的节点值
    for len(stack2) > 0 {
        node := stack2[len(stack2)-1]
        stack2 = stack2[:len(stack2)-1]
        fmt.Println(node.Val)
    }
}

通过以上代码,我们可以实现二叉树的前序、中序和后序遍历。这些遍历方法在实际开发中有着广泛的应用,例如构建二叉树,搜索树等。

相关推荐