方法1
把其中一個子樹翻轉,然後對比兩個子樹是否相同
var isSymmetric = function(root) {
let invert = function(treeNode){
if(!treeNode)return null
let node = treeNode.left
treeNode.left = invert(treeNode.right)
treeNode.right = invert(node)
return treeNode
}
function isSameTree(p,q){
if(!p&&!q)return true
if(!p||!q)return false
if(p.val!==q.val)return false
return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right)
}
return isSameTree(root?root.left:null,invert(root?root.right:null))
};
方法2
左子樹按照中左右的順序遍歷,右子樹按照中右左的順序遍歷,如果每一步訪問的值都相同,說明左右子樹對稱
var isSymmetric = function(root) {
let hander = function(p,q){
if(!p&&!q)return true
if(!p||!q)return false
if(p.val!==q.val)return false
return hander(p.left,q.right)&&hander(p.right,q.left)
}
return hander(root?root.left:null,root?root.right:null)
}
方法3
使用棧(或者隊列),把需要比較的兩個節點壓進棧,再依次比較
var isSymmetric = function(root) {
let list = []
list.push(root?root.left:null)
list.push(root?root.right:null)
while(list.length>0){
let p = list.pop()
let q = list.pop()
if(!p&&!q)continue
if(!p||!q)return false
if(p.val!==q.val)return false
list.push(p.left)
list.push(q.right)
list.push(p.right)
list.push(q.left)
}
return true
}
參考https://blog.csdn.net/xiezongsheng1990/article/details/79574057