golang二叉树非递归遍历

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

在Golang开发领域,二叉树是一种经常使用的数据结构。通过递归方式遍历二叉树是一种常见的做法,但是在某些情况下,我们可能需要使用非递归方式来遍历二叉树。本文将介绍如何使用Golang实现二叉树的非递归遍历,包括前序、中序和后序遍历算法。

前序遍历

前序遍历指的是先访问节点本身,然后再访问左子树和右子树。在实现非递归的前序遍历算法时,我们可以使用一个栈来保存节点,首先将根节点入栈。

接下来,我们循环执行以下操作:

  1. 弹出栈顶节点并访问之。
  2. 如果该节点有右子树,将其右子树入栈。
  3. 如果该节点有左子树,将其左子树入栈。
  4. 重复上述操作,直到栈为空。

下面是用Golang实现的非递归前序遍历代码:

func PreorderTraversal(root *TreeNode) []int {
    if root == nil {
        return []int{}
    }

    stack := []*TreeNode{root}
    result := []int{}

    for len(stack) > 0 {
        node := stack[len(stack)-1]
        stack = stack[:len(stack)-1]
        
        result = append(result, node.Val)

        if node.Right != nil {
            stack = append(stack, node.Right)
        }
        
        if node.Left != nil {
            stack = append(stack, node.Left)
        }
    }

    return result
}

中序遍历

中序遍历指的是先访问左子树,然后再访问节点本身和右子树。同样地,我们可以使用一个栈来保存节点,并模拟中序遍历的过程。

具体的做法如下:

  1. 从根节点开始,依次将左子节点入栈,直到没有左子节点。
  2. 弹出栈顶节点并访问之。
  3. 如果该节点有右子树,则将右子树作为当前节点,并继续执行步骤1。
  4. 重复上述操作,直到栈为空。

下面是用Golang实现的非递归中序遍历代码:

func InorderTraversal(root *TreeNode) []int {
    if root == nil {
        return []int{}
    }

    stack := []*TreeNode{}
    result := []int{}
    cur := root

    for cur != nil || len(stack) > 0 {
        for cur != nil {
            stack = append(stack, cur)
            cur = cur.Left
        }

        cur = stack[len(stack)-1]
        stack = stack[:len(stack)-1]
        result = append(result, cur.Val)
        cur = cur.Right
    }

    return result
}

后序遍历

后序遍历指的是先访问左子树和右子树,最后再访问节点本身。同样地,我们可以使用一个栈来保存节点,并模拟后序遍历的过程。

具体的做法如下:

  1. 将根节点入栈。
  2. 每次从栈中弹出一个节点,并将其插入到结果列表的头部。
  3. 如果该节点有左子树,则将左子树入栈。
  4. 如果该节点有右子树,则将右子树入栈。
  5. 重复上述操作,直到栈为空。

下面是用Golang实现的非递归后序遍历代码:

func PostorderTraversal(root *TreeNode) []int {
    if root == nil {
        return []int{}
    }

    stack := []*TreeNode{root}
    result := []int{}

    for len(stack) > 0 {
        node := stack[len(stack)-1]
        stack = stack[:len(stack)-1]

        result = append([]int{node.Val}, result...)

        if node.Left != nil {
            stack = append(stack, node.Left)
        }

        if node.Right != nil {
            stack = append(stack, node.Right)
        }
    }

    return result
}

通过以上代码,我们可以在Golang中实现二叉树的非递归前序、中序和后序遍历算法。这些算法在一些场景中非常有用,特别是在需要对树进行深度优先搜索的情况下。有了这些代码作为基础,我们可以更灵活地应用二叉树遍历算法解决实际问题。

相关推荐