二叉树遍历
前序遍历 根左右
后序遍历 左根右
后序遍历 左右根
前序递归
func preorderTraversal(root *TreeNode)
{
if root==nil{
return
}
fmt.Println(root.val)
preorderTraversal(root.Left)
preorderTraversal(root.Right)
}
前序非递归
func preorderTraversal(root *TreeNode) []int
{
if root == nil{
return nil
}
result:=make([]int,0)
stack:=make([]TreeNode,0)
for root!=nil||len(stack)!=0{
for root!=nil
{
result=append(rusult,root.Val)
stack=append(stack,root)
root=root.Left
}
node:=stack[len(stack)-1]
stack=stack[:len(stack)-1]
root=node.Right
}
return result
}
中序非递归
func inorderTraversal(root *TreeNode)
[]int{
result := make([]int,0)
if root == nil{
return result
}
stack := make([]*TreeNode,0)
for len(stack) > 0 || root != nil{
for root != nil{
stack = append(stack,root)
root = root.Left
}
val := stack[len(stack)-1]
stack = stack[:len(stack)-1]
result = append(result,val.Val)
root = val.Right
}
return result
}
后序非递归
func postorderTraversal(root *TreeNode)
[]int{
if root == nil{
return nil
}
result := make([]int,0)
stack :=make([]*TreeNode,0)
var lastVisit *TreeNode
for root != nil || len(stack) != 0
{
for root != nil{
stack = append(stack,root)
root = root.Left
}
node := stack[len(stack)-1]
if node.Right == nil || node.Right
== last Visit{
stack = stack[:len(stack)-1]
result = append(result,node.Val)
lastVisit = node
}
else{
root = node.Right
}
}
return result
}
DFS深度搜索-从上到下
type TreeNode struct{
Val int
Left *TreeNode
Right *TreeNode
}
func preorderTraversal(root *TreeNode)int[]{
result := make([]int,0)
dfs(root,&result)
return result
}
func dfs(root *TreeNode,rusult *[]int){
if root == nil{
ruturn
}
*result = append(*result,root.Val)
dfs(root.Left,result)
dfs(root.Right,result)
}
DFS深度搜索-从上到下(分治法)
func preorderTraversal(root *TreeNode)[]int{
result := divideAndConquer(root)
return result
}
func divideAndConquer(root *TreeNode)[]int{
result := make([]int,0)
if root == nil{
return result
}
left := divideAndConquer(root.Left)
right := divideAndConquer(root.Right)
result = append(result,root.Val)
result = append(result,left...)
result = append(result,right...)
return result
}
BFS层次遍历
func levelOrder(root *TreeNode)[][]int{
result := make([][]int,0)
if root == nil{
return result
}
queue := make([]*TreeNode,0)
queue = append(queue,root)
for len(queue) > 0{
list := make([]int,0)
l := len(queue)
for i := 0; i < 1; i++{
level := queue[0]
queue = queue[1:]
list = append(list,level.Val)
if level.Left != nil{
queue = append(queue,level.Left)
}
if level.Right != nil{
queue = append(queue,level.Right)
}
}
result = append(result,lsit)
}
return result
}