最基本的遍历递归实现
//二叉树节点数据结构定义
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
前序
//递归前序,打印二叉树节点值
func preOrderTraversal(root *TreeNode) (res []int){
var preOrder func(root *TreeNode)
preOrder = func(root *TreeNode){
if root == nil {
return
}
res = append(res, root.Val)
preOrder(root.Left)
preOrder(root.Right)
}
preOrder(root)
return
}
//迭代前序
func preOrderTraversal(root *TreeNode) (res []int){
stack := []*TreeNode{}
if root==nil{return}
stack = append(stack, root.Val)
for len(stack)!=0 {
curNode := stack[len(stack)-1]
stack = stack[:len(stack)-1]
res = append(res, curNode.Val)
if curNode.Right != nil {
stack = append(stack, curNode.Right)
}
if curNode.Left != nil {
stack = append(stack, curNode.Left)
}
}
return
}
中序
//递归中序
func midOrderTraversal(root *TreeNode) (res []int){
var midOrder(root *TreeNode)
midOrder = func(root *TreeNode){
if root==nil{return}
midOrder(root.Left)
res = append(res, root.Val)
midOrder(root.Right)
}
midOrder(root)
return
}
//迭代中序
func midOrderTraverse(root *TreeNode) (res []int){
stack := []*TreeNode{}
if root==nil{return}
for root!=nil{
stack = append(stack, root)
root = root.Left
}
for len(stack)!=0 {
curNode:=stack[len(stack)-1]
stack = stack[:len(stack)-1]
res = append(res, curNode.Val)
curNode = curNode.Right
for curNode!=nil {
stack = append(stack, curNode)
curNode = curNode.Left
}
}
return
}
后序
//后序递归
func postOrderTraverse(root *TreeNode) (res []int){
var postOrder(root *TreeNode)
postOrder = func(root *TreeNode){
if root==nil {return}
postOrder(root.Left)
postOrder(root.Right)
res = append(res, root.Val)
}
postOrder(root)
return
}
//后续迭代,在前序迭代思路上做修改,即入栈节点先左后右,结果翻转
func postOrderTraverse(root *TreeNode) (res []int){
stack := []*TreeNode{}
if root == nil {return}
stack = append(stack, root)
for len(stack)!=0{
curNode:=stack[len(stack)-1]
stack=stack[:len(stack)-1]
res=append(res, curNode.Val)
if curNode.Left!=nil{
stack=append(stack, curNode.Left)
}
if curNode.Right!=nil{
stack=append(stack, curNode.Right)
}
}
i, j := 0, len(res)-1
for i<j {
res[i], res[j] = res[j], res[i]
i++, j--
}
return res
}
总结一下基于此的题目
二叉树最大深度,递归用后序遍历
func getMaxDepth(root *TreeNode)int{
if root==nil {
return 0
}
left := getMaxDepth(root.Left)
right := getMaxDepth(root.Right)
var max func(i, j int)int
max = func(i, j int)int{
if i<j {return j}
return i
}
return max(left, right)+1
}
n叉树最大深度
func maxDepth(root *Node) int {
if root == nil {return 0}
ans := 0
for _, v := range root.Children{
depth := maxDepth(v)
if depth>ans{
ans = depth
}
}
return ans+1
}
二叉树最小深度
比最大深度要多考虑:左右子树为空的时候,就不能算深度了
func getMinDepth(root *TreeNode)int{
if root == nil {return 0}
left := getMinDepth(root.Left)
right := getMinDepth(root.Right)
if root.Left == nil && root.Right!=nil {
return right+1
}
if root.Left != nil && root.Right == nil {
return left+1
}
return min(left, right)+1
}
判断是否为平衡二叉树
func isBalanced(root *TreeNode) bool {
if root == nil {return true}
//后续遍历得到长度
var getDepth func(root *TreeNode)int
getDepth = func(root *TreeNode)int{
if root==nil {return 0}
left := getDepth(root.Left)
right := getDepth(root.Right)
if left == -1 || right == -1 || abs(left - right)>1 {return -1}
return max(left, right)+1
}
left := getDepth(root.Left)
right := getDepth(root.Right)
if left == -1 || right == -1 || abs(left - right)>1 {return false}
return true
}
打印二叉树所有的路径总和,前序遍历
输入: root = [1,2,3,null,5]
输出: ["1->2->5","1->3"]
func binaryTreePaths(root *TreeNode)string{
res := []string{}
if root == nil {return res}
var preOrder func(root *TreeNode, s string)
preOrder = func(root *TreeNode, s string){
//终止条件
if root.Left == nil && root.Right == nil {
v := s + strconv.Itoa(root.Val)
res = append(v)
return
}
s= s+strconv.Itoa(root.Val)+"->"
if root.Left != nil {
preOrder(root.Left, s)
}
if root.Right != nil {
preOrder(root.Right, s)
}
}
proOrder(root, "")
return res
}