1.前序
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func preorderTraversal(root *TreeNode) []int {
res := []int{}
if root == nil {
return res
}
stack := []*TreeNode{}
cur := root
for len(stack) > 0 || cur != nil {
for cur != nil {
res = append(res, cur.Val)
stack= append(stack, cur)
cur = cur.Left
}
temp := stack[len(stack) -1]
stack = stack[:len(stack) -1]
cur = temp.Right
}
return res
}
2.中序
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func inorderTraversal(root *TreeNode) []int {
res := []int{}
if root == nil {
return res
}
stack := []*TreeNode{}
cur := root
for len(stack) > 0 || cur != nil {
for cur != nil {
stack = append(stack, cur)
cur = cur.Left
}
temp := stack[len(stack) -1]
stack = stack[:len(stack) -1]
res = append(res, temp.Val)
cur = temp.Right
}
return res
}
3. 后序
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func postorderTraversal(root *TreeNode) []int {
res := []int{}
if root == nil {
return res
}
stack := []*TreeNode{}
flagMap := make(map[*TreeNode]int)
cur := root
for len(stack) >0 || cur != nil {
for cur != nil {
stack = append(stack,cur)
flagMap[cur] = 1
cur = cur.Left
}
temp := stack[len(stack) -1]
if flagMap[temp] == 1 {
flagMap[temp] ++
cur = temp.Right
} else {
res = append(res, temp.Val)
stack = stack[:len(stack) -1]
}
}
return res
4. 层序
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func levelOrder(root *TreeNode) [][]int {
res := [][]int{}
if root == nil {
return res
}
queue := []*TreeNode{}
queue = append(queue, root)
for len(queue) > 0 {
size := len(queue)
level := []int{}
for size > 0 {
cur := queue[0]
queue = queue[1:]
level = append(level, cur.Val)
if cur.Left != nil {
queue = append(queue, cur.Left)
}
if cur.Right != nil {
queue = append(queue, cur.Right)
}
size --
}
res = append(res, level)
}
return res
}
5. 是否是镜像树
func isSymmetric(root *TreeNode) bool {
if root == nil {
return true
}
return isSameTree(root.Left, mirrorTree(root.Right))
}
func mirrorTree(node *TreeNode) *TreeNode {
if node == nil {
return nil
}
tmp := node.Left
node.Left = mirrorTree(node.Right)
node.Right= mirrorTree(tmp)
return node
}
func isSameTree(A, B *TreeNode)bool {
if A == nil && B == nil {
return true
}else if A == nil || B == nil {
return false
} else if A.Val == B.Val {
return isSameTree(A.Left, B.Left) && isSameTree(A.Right, B.Right)
}
return false
}
func isSymmetric(root *TreeNode) bool {
if root == nil {
return true
}
return recursion(root.Left, root.Right)
}
func recursion(A, B *TreeNode) bool {
if A == nil && B == nil {
return true
}
if A == nil || B == nil || A.Val != B.Val {
return false
}
return recursion(A.Left, B.Right) && recursion(A.Right, B.Left)
}