二叉树:镜像对称
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/symmetric-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法一:利用中序遍历和回文实现
实现思路:对称的二叉树在中序遍历时结果是回文,所以只要中序遍历(midTrans函数)出结果后判定是否为回文即可(isPalindrome函数)
但是发现问题,当输入为[1,2,2,2,null,2]时,这不是一个对称树,但是中序遍历为[2,2,1,2,2],是回文
所以,将每一节点形成一个类 node
class node{
constructor(level,value){
this.level=level;
this.value=value;
}
}
记录层数和值,这样再匹配就可以判断是否为对称二叉树
完整代码如下
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {boolean}
*/
class node{
constructor(level,value){
this.level=level;
this.value=value;
}
}
var isSymmetric = function(root) {
let res=new Array();
let level=0;
let midTrans=(n)=>{
level++;
if(n){
midTrans(n.left);
res.push(new node(level,n.val));
midTrans(n.right);
}
level--;
}
midTrans(root);
console.log(res)
return isPalindrome(res)
};
var isPalindrome=(str)=>{
let flag=true
for(let i=0;i<(str.length-1)/2;i++){
if((str[i].level==str[str.length-1-i].level)&&(str[i].value==str[str.length-1-i].value)) ;
else flag=false;
}
return flag;
}
方法二:递归对比左右子树
实现思路:如果一个树是对称二叉树,也就是说左子树和右子树的镜面翻转一样就可以了。
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {boolean}
*/
let isSy=(node1,node2)=>{
if(node1==null&&node2==null) return true;
if(node1==null||node2==null||node1.val!=node2.val) return false;
return isSy(node1.left,node2.right)&&isSy(node1.right,node2.left)
}
var isSymmetric = function(root) {
return isSy(root,root);
};