二叉树类高频算法题golang实现
Posted Kris_u
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树类高频算法题golang实现相关的知识,希望对你有一定的参考价值。
1、二叉树的先序遍历、中序遍历、后序遍历
先序遍历:根节点-->左子树--->右子树
type TreeNode struct
Value int
Left,Right *TreeNode
func (node *TreeNode) traverse()
if node ==nil
return
fmt.Print(node.Value+" ")
node.Left.traverse()
node.Right.traverse()
中序遍历:左子树--->根节点---->右子树
func (node *TreeNode) traverse()
if node ==nil
return
node.Left.traverse()
fmt.Print(node.Value+" ")
node.Right.traverse()
后序遍历:左子树--->右子树--->根节点
func (node *TreeNode) traverse()
if node ==nil
return
node.Left.traverse()
node.Right.traverse()
fmt.Print(node.Value+" ")
2、二叉树的层次遍历
type TreeNode struct
Val int
Left *TreeNode
Right *TreeNode
func levelOrder(root *TreeNode) [][]int
if root == nil
return nil
res := [][]int
que := []*TreeNoderoot //队列
for len(que) > 0
queSize := len(que) //当前层的节点数目
current := []int //存储当前层的节点值
for i := 0; i < queSize; i++
out := que[0] //取出队列的第一个节点
que = que[1:] //删除队列的第一个节点
current = append(current, out.Val)
if out.Left != nil
que = append(que, out.Left)
if out.Right != nil
que = append(que, out.Right)
res = append(res, current) //将每层节点值的数组追加到二维数组res
return res
3、二叉树的锯齿形层次遍历
func zigzagLevelOrder(root *TreeNode) (ans [][]int)
if root == nil
return nil
res := [][]int
que := []*TreeNoderoot //队列
for l := 0; len(que) > 0; l++
queSize := len(que) //当前层的节点数目
current := []int //存储当前层的节点值
for i := 0; i < queSize; i++
out := que[0] //取出队列的第一个节点
que = que[1:] //删除队列的第一个节点
if out.Left != nil
que = append(que, out.Left)
if out.Right != nil
que = append(que, out.Right)
current = append(current, out.Val)
if l%2 != 0 //根据l%2是否为零,决定先从左往右,还是先从右往左
for j := 0; j < len(current)/2; j++
index := len(current) - j - 1
if j != index
current[j], current[index] = current[index], current[j]
res = append(res, current) //将每层节点值的数组追加到二维数组res
return res
func main()
//创建一棵树、
root := new(TreeNode)
root.Val = 9
left1 := new(TreeNode)
left1.Val = 6
right1 := new(TreeNode)
right1.Val = 8
left2 := new(TreeNode)
left2.Val = 3
right2 := new(TreeNode)
right2.Val = 5
root.Left = left1
root.Right = right1
left1.Left = left2
right1.Right = right2
levelOrder(root)
zigzagLevelOrder(root)
编译输出:
levelOrder:res [[9] [6 8] [3 5]]
zigzagLevelOrder:res [[9] [8 6] [3 5]] // l%2 != 0
zigzagLevelOrder:res [[9] [6 8] [5 3]] // l%2 == 0
以上是关于二叉树类高频算法题golang实现的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode练习(Python):树类:第98题:验证二叉搜索树:给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节
Leetcode练习(Python):树类:第108题:将有序数组转换为二叉搜索树:将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的