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)}