二叉树【
每个节点最多有两个子节点。
10
/ \
9 20
/ \
15 35
二叉树的特点:
- 每个节点最多有两个子树,节点的度最大为2;
- 左子树和右子树是有顺序的,次序不能颠倒;
- 即使某节点只有一个子树,也要区分左右子树;
对称二叉树
如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
10
/ \
5 5
/ \ / \
1 4 4 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 },
},
};
JS实现
利用递归实现对称二叉树判断
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)); // true
console.log(isSymmetrical(binaryTree)); // false
More
对称二叉树
https://www.luogu.com.cn/problem/P5018
对称二叉树(思路与实现)
https://blog.csdn.net/qq_28081081/article/details/80878973
JavaScript判断对称二叉树
https://blog.csdn.net/AS_Tammy/article/details/93600323