前言
问问自己,刷题的效果真的达到了吗?
内容
一、翻转二叉树
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
递归
Go
func invertTree(root *TreeNode) *TreeNode {
if root==nil{
return root
}
root.Left,root.Right=root.Right,root.Left
invertTree(root.Left)
invertTree(root.Right)
return root
}
二、对称二叉树
给你一个二叉树的根节点 root
, 检查它是否轴对称。
递归
我们可以实现这样一个递归函数,通过「同步移动」两个指针的方法来遍历这棵树,p 指针和 q 指针一开始都指向这棵树的根,随后 p 右移时,q 左移,p 左移时,q 右移。每次检查当前 p 和 q 节点的值是否相等,如果相等再判断左右子树是否对称。
Go
func isSymmetric(root *TreeNode) bool {
return dfs(root.Left,root.Right)
}
func dfs(left *TreeNode,right *TreeNode) bool{
if left==nil&&right==nil{
return true
}
if left==nil||right==nil{
return false
}
if left.Val!=right.Val{
return false
}
return dfs(left.Left,right.Right)&&dfs(left.Right,right.Left)
}
迭代
把递归程序改写成迭代程序
Go
func isSymmetric(root *TreeNode)bool{
u,v:=root,root
queue:=[]*TreeNode{}
queue=append(queue,u)
queue=append(queue,v)
for len(queue)>0{
u,v = queue[0],queue[1]
queue=queue[2:]
if u==nil&&v==nil{//要先判断
continue
}
if u==nil||v==nil{
return false
}
if u.Val!=v.Val{
return false
}
queue=append(queue,u.Left)
queue=append(queue,v.Right)
queue=append(queue,u.Right)
queue=append(queue,v.Left)
}
return true
}
三、完全二叉树的节点个数
给你一棵完全二叉树 的根节点 root
,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h
层,则该层包含 1~ 2h
个节点。
广度优先搜素
Go
func countNodes(root *TreeNode) int {
var count int
if root==nil{//没有这个会报错 昨天遇到过
return 0
}
level:=[]*TreeNode{root}
for len(level)>0{
temp:=level
level=nil
for _,node:=range temp{
count++
if node.Left!=nil{
level=append(level,node.Left)
}
if node.Right!=nil{
level=append(level,node.Right)
}
}
}
return count
}
最后
令人心动的offer啊,能拿到吗?