一、前序遍历
基于Leetcode
1、递归
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func preorderTraversal(root *TreeNode) []int {
var vals []int
var preorder func(*TreeNode)
preorder = func (node *TreeNode) {
if node == nil {
return
}
vals = append(vals, node.Val)
preorder(node.Left)
preorder(node.Right)
}
preorder(root)
return vals
}
2、迭代
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func preorderTraversal(root *TreeNode) []int {
var vals []int
stack, node := []*TreeNode{}, root // 迭代借助栈实现
for node != nil || len(stack) > 0 {
for node != nil { // 一直向左遍历,同时记录值和节点。记录节点是记录路径,为了后续继续遍历右节点
vals = append(vals, node.Val)
stack = append(stack, node)
node = node.Left
}
// 继续遍历右子树
node = stack[len(stack)-1].Right
stack = stack[:len(stack)-1]
}
return vals
}
二、中序遍历
1、递归
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func inorderTraversal(root *TreeNode) []int {
var vals []int
var inorder func(*TreeNode)
inorder = func(node *TreeNode) {
if node == nil {
return
}
inorder(node.Left)
vals = append(vals, node.Val)
inorder(node.Right)
}
inorder(root)
return vals
}
2、迭代
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func inorderTraversal(root *TreeNode) []int {
var vals []int
stack, node := []*TreeNode{}, 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]
vals = append(vals, node.Val)
node = node.Right
}
return vals
}
三、后序遍历
1、递归
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func postorderTraversal(root *TreeNode) []int {
var vals []int
var postorder func(*TreeNode)
postorder = func(node *TreeNode) {
if node == nil {
return
}
postorder(node.Left)
postorder(node.Right)
vals = append(vals, node.Val)
}
postorder(root)
return vals
}
2、迭代
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func postorderTraversal(root *TreeNode) []int {
var vals []int
var prev *TreeNode
stack, node := []*TreeNode{}, 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]
if node.Right == nil || node.Right == prev { // 右子树为空或者已经遍历过,那么遍历当前节点
vals = append(vals, node.Val)
prev = node
node = nil
} else { // 右子树不为空并且没有遍历过,则继续遍历右子树
stack = append(stack, node)
node = node.Right
}
}
return vals
}
版权声明:本文为Interesting_wang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。