【剑指offer】058-对称的二叉树

题目

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的

方法

方法一:按照题目定义,先拷贝一个镜像树,再判断是否和原树相等
方法二:递归或者迭代直接判断
参考:https://www.jianshu.com/p/e3df4cc26c76

方法一

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function isSymmetrical(pRoot{
  // write code here
  if (!pRoot) return true
  let tRoot = new TreeNode(pRoot.val)
  getMirror(tRoot, pRoot)
  return isSameTree(tRoot, pRoot)
}
function getMirror (tRoot, pRoot{
  if (pRoot.left) {
    tRoot.right = new TreeNode(pRoot.left.val)
    getMirror(tRoot.right, pRoot.left)
  }
  if (pRoot.right) {
    tRoot.left = new TreeNode(pRoot.right.val)
    getMirror(tRoot.left, pRoot.right)
  }
}
function isSameTree (tRoot, pRoot{
  if (!tRoot && !pRoot) {
    return true
  } else if (tRoot && pRoot && tRoot.val === pRoot.val) {
    return isSameTree(tRoot.left, pRoot.left) && isSameTree(tRoot.right, pRoot.right)
  } else {
    return false
  }
}

方法一

思路

直接判断树是否是对称的,类比判断两个树是否相等,这边应该判断两个树是否镜像相等
定义是,两个树的根节点数值相等的基础上

  1. 左树的左子树和右树的右子树要相等
  2. 左树的右子树和右树的左子树要相等

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function isSymmetrical(pRoot{
  // write code here
  if (!pRoot) return true
  return isMirror(pRoot.left, pRoot.right)
}
function isMirror (root1, root2{
  if (!root1 && !root2) return true
  if (root1 && root2 && root1.val === root2.val) {
    return isMirror(root1.left, root2.right) && isMirror(root1.right, root2.left)
  }
  return false
}
文章作者: ptp
文章链接: https://youyingjie114.github.io/2019/11/07/jz-offer/jz-offer-058/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PTP'S BLOG