26.树的子结构
//注意边界问题
var isSubStructure = function(A, B) {
if(!A||!B) return false;
return helper(A,B)||isSubStructure(A.left, B)||isSubStructure(A.right, B);
};
var helper = (A, B)=>{
if(!B) return true;
if(!A) return false;
return A.val===B.val&&helper(A.left, B.left)&&(A.right, B.right);
}
27.二叉树的镜像
//不敢相信,直接交换就行了,我在干嘛
var mirrorTree = function(root) {
if(!root) return root;
let tmp = new TreeNode(root.val);
let res = tmp;
helper(tmp, root);
return res;
};
var helper = (res, root)=>{
if(root.left){
res.right = new TreeNode(root.left.val);
helper(res.right, root.left);
}
if(root.right){
res.left = new TreeNode(root.right.val);
helper(res.left, root.right);
}
}
//直接交换
var mirrorTree = function(root) {
if(!root) return root;
let left = mirrorTree(root.right);
let right = mirrorTree(root.left);
root.left = left;
root.right = right;
return root;
};
28.对称的二叉树
//弱智写法
var isSymmetric = function(root) {
if(!root) return root;
let tmp = new TreeNode(root.val);
let res = tmp;
helper(tmp, root);
let stack1 = [res];
let stack2 = [root];
while(stack1.length!==0&&stack2.length!==0){
let store1 = stack1.shift();
let store2 = stack2.shift();
if(store1.val!==store2.val) return false;
if(store1.left){
if(store2.left){
stack1.push(store1.left);
stack2.push(store2.left);
}
else{
return false;
}
}
if(store1.right){
if(store2.right){
stack1.push(store1.right);
stack2.push(store2.right);
}
else{
return false;
}
}
}
return stack1.length===stack2.length;
};
var helper = (res, root)=>{
if(root.left){
res.right = new TreeNode(root.left.val);
helper(res.right, root.left);
}
if(root.right){
res.left = new TreeNode(root.right.val);
helper(res.left, root.right);
}
}
//直接比较
var isSymmetric = function(root) {
return root?helper(root.left, root.right):root;
};
var helper = (left, right)=>{
if(!left&&!right) return true;
if(!left||!right||left.val!==right.val) return false;
//因为第一层条件已经过滤掉两者都为空的情况了,如果有一边为空则另一边一定不为空。
return helper(left.left, right.right)&&helper(left.right,right.left);
}