刷题之路(持续更新)

二叉树遍历

前序遍历 根左右
后序遍历 左根右
后序遍历 左右根

前序递归

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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值