是否是对称二叉树
又是熟悉的递归,对于两个节点是否对称有几种情况
1. 是否都不存在
2. 是否有一个不存在
3. 都存在但值是否相等
再去递归判断剩下的
var isSymmetric = function(root) {
if(!root){
return true
}
return isSym(root,root)
};
function isSym(left,right){
if(!left&&!right){
return true
}
if(!left||!right){
return false
}
if(left.val!==right.val){
return false
}
return isSym(left.left,right.right)&&isSym(left.right,right.left)
}
是否是相同的树
判断的时候节点有四种情况:
1. 都不存在=>递归结束
2. 其中一个不存在=>两树不同
3. 都存在但值不同=>递归结束
4. 都存在且值相同=>继续看看子节点相同否
var isSameTree = function(p, q) {
return isSame(p,q)
};
function isSame(p,q){
if(!p&&!q){
return true
}
if(!p||!q){
return false
}
if(p.val!==q.val){
return false
}
return isSame(p.left,q.left)&&isSame(p.right,q.right)
}
b是否是a的子树
同时遍历的是两个树,a的所有节点都做一次起始的根结点,让b去跟以a的某个节点为根结点的树进行比较,只要有任何一棵树是成立的就返回为true
要注意一个地方⚠️在比较的时候,要先判断b是否已经遍历完了,而非先判断a,否则就会出现两者都遍历完了,但认为两者不相同的情况
var isSubStructure = function(A, B) {
if(!A||!B){
return false
}
return isSubTree(A,B)||isSubStructure(A.left,B)||isSubStructure(A.right,B)
};
function isSubTree(p,q){
if(!q){
return true
}
if(!p){
return false
}
if(p.val!==q.val){
return false
}
return isSubTree(p.left,q.left)&&isSubTree(p.right,q.right)
}