参考自 ConardLi:《对称的二叉树》公众号:code 秘密花园
对称二叉树:
8
/ \
6 6
/\ /\
5 7 7 5
非对称二叉树:
8
/ \
6 5
/\ /\
5 7 7 5
实现思路:
- 判断根节点相同
- 左子树的右节点和右子树的左节点相同
- 右子树的左节点和左子树的右节点相同
步骤 1: 模拟一个对称二叉树和非对称二叉树
// 对称二叉树
const symmetricalTree = {
val: 8,
left: {
val: 6,
left: {val: 5, left: null, right: null},
right: {val: 7, left: null, right: null}
},
right: {
val: 6,
left: {val: 7, left: null, right: null},
right: {val: 5, left: null, right: null}
}
}
// 非对称二叉树
const binaryTree = {
val: 8,
left: {
val: 6,
left: {val: 5, left: null, right: null},
right: {val: 7, left: null, right: null}
},
right: {
val: 9,
left: {val: 7, left: null, right: null},
right: {val: 5, left: null, right: null}
}
}
步骤 2: 利用递归实现对称二叉树判断
function isSymmetrical(pRoot) {return isSymmetricalTree(pRoot, pRoot);
}
function isSymmetricalTree(node1, node2) {
// 判断两个节点都是否为空
if (!node1 && !node2) {return true;}
// 判断两个节点是否存在一个为空
if (!node1 || !node2) {return false;}
// 判断两个节点是否相同
if (node1.val != node2.val) {return false;}
return isSymmetricalTree(node1.left, node2.right) && isSymmetricalTree(node1.right, node2.left);
}
输出:
console.log(isSymmetrical(symmetricalTree));
console.log(isSymmetrical(binaryTree));
结果如下:
true
false
参考自 ConardLi:《对称的二叉树》公众号:code 秘密花园