剑指 Offer 26. 树的子结构
func isSubStructure(A *TreeNode, B *TreeNode) bool {
if A == nil && B == nil {
return true
}
if A == nil || B == nil{
return false
}
var ans bool
//当在 A 中找到 B 的根节点时,进入helper递归校验
if A.Val == B.Val{
ans = helper(A,B)
}
//ans == false,说明 B 的根节点不在当前 A 树顶中,进入 A 的左子树进行递归查找
if !ans {
ans = isSubStructure(A.Left,B)
}
//当 B 的根节点不在当前 A 树顶和左子树中,进入 A 的右子树进行递归查找
if !ans {
ans = isSubStructure(A.Right,B)
}
return ans
//或利用 || 的短路特性可写成
//return helper(A,B) || isSubStructure(A.Left,B) || isSubStructure(A.Right,B)
}
//helper 校验 B 是否与 A 的一个子树拥有相同的结构和节点值
func helper(a,b *TreeNode) bool{
if b == nil{
return true
}
if a == nil{
return false
}
if a.Val != b.Val{
return false
}
//a.Val == b.Val 递归校验 A B 左子树和右子树的结构和节点是否相同
return helper(a.Left,b.Left) && helper(a.Right,b.Right)
}
剑指 Offer 27. 二叉树的镜像
// 就是翻转二叉树
func mirrorTree(root *TreeNode) *TreeNode {
if root == nil {return nil}
root.Left,root.Right = root.Right, root.Left
mirrorTree(root.Left)
mirrorTree(root.Right)
return root
}
剑指 Offer 28. 对称的二叉树
func isSymmetric(root *TreeNode) bool {
if root == nil {return true}
return digui(root.Left, root.Right)
}
func digui(left, 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 digui(left.Left, right.Right) && digui(left.Right, right.Left)
}