题目
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的
方法
方法一:按照题目定义,先拷贝一个镜像树,再判断是否和原树相等
方法二:递归或者迭代直接判断
参考: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 isSymmetrical(pRoot) { 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 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
function isSymmetrical(pRoot) { 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 }
|