前序、中序、后序遍历
package main
import . "nc_tools"
/*
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
/**
*
* @param root TreeNode类
* @return int整型一维数组
*/
type Stack struct {
Val []*TreeNode
i int
}
func (stack *Stack) Push(node *TreeNode) {
stack.Val = append(stack.Val, node)
stack.i++
}
func (stack *Stack) Pop() (node *TreeNode) {
node = stack.Val[stack.i-1]
stack.Val = stack.Val[0 : stack.i-1]
stack.i--
return
}
func postorderTraversal( root *TreeNode ) []int {
// write code here
var retList []int
if root == nil {
return retList
}
var pre *TreeNode
stack := new(Stack)
stack.Push(root)
for len(stack.Val) > 0 {
node := stack.Val[stack.i-1]
if (pre != nil && (pre == node.Left || pre == node.Right)) || (node.Left == nil && node.Right == nil) {
//fmt.Println(node.Val)
retList = append(retList, node.Val)
stack.Pop()
pre = node
continue
}
if node.Right != nil {
stack.Push(node.Right)
}
if node.Left != nil {
stack.Push(node.Left)
}
}
return retList
}
func preorderTraversal( root *TreeNode ) []int {
// write code here
var retList []int
if root == nil {
return retList
}
stack := new(Stack)
stack.Push(root)
for len(stack.Val) > 0 {
node := stack.Pop()
//fmt.Println(node.Val)
retList = append(retList, node.Val)
if node.Right != nil {
stack.Push(node.Right)
}
if node.Left != nil {
stack.Push(node.Left)
}
}
return retList
}
func inorderTraversal( root *TreeNode ) []int {
// write code here
var retList []int
if root == nil {
return retList
}
stack := new(Stack)
stack.Push(root)
node := root
for len(stack.Val) > 0 {
for node.Left != nil {
stack.Push(node.Left)
node = node.Left
}
for len(stack.Val) > 0 {
node = stack.Pop()
//fmt.Println(node.Val)
retList = append(retList, node.Val)
if node.Right != nil {
stack.Push(node.Right)
node = node.Right
break
}
}
}
return retList
}
本文深入探讨了二叉树的前序、中序和后序遍历算法,提供了详细的Go语言实现代码,包括利用栈结构进行遍历的示例。通过对每种遍历方式的解析,读者可以更好地理解二叉树数据结构及其操作。

被折叠的 条评论
为什么被折叠?



