給定乙個二叉樹,檢查它是否是映象對稱的。
例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面這個 [1,2,2,null,3,null,3] 則不是映象對稱的:
1
/ \
2 2
\ \
3 3
請用遞迴和非遞迴兩種方法解決問題。
/**
* definition for a binary tree node.
* public class treenode
* }*/class
solution
}
這種題第一印象是什麼?拿到後應該怎麼做?
我的第一印象,是分別讓根節點的左右兩個孩子分別作為一顆新的樹,然後按照一定的方式遍歷,對比二者的值,判斷是否相等。天不遂人願,總有測試樣例通過不了。細究,是因為遍歷出來的值順序並不一定和原始的排序順序相等。看如下用例:
1
/ \
2 2
/ /
2 2
它並不對稱,但是遍歷出的子樹均為[2,2]
,如果將null值也記錄起來,則不得不記錄當前節點的層數。只有當這一層有其他節點非空的時候,才會將這一層的值都記錄下來。是不是太麻煩了,這畢竟是個簡單題。
再審視一下樹的結構:
1
/ \
2 2
/ \ / \
3 4 4 3
當我們對比的時候,比較的是root.left
和root.right
,然後比較root.left.left
和root.right.right
,root.left.right
和root.right.left
。如果樹再高點,就是繼續劃分。但是用**可以寫成:
if
(root.left == root.right)
left = root.left
right = root.right
if(left.left== right.right && left.right == right.left)
leftl = left.left
leftr = left.right
rightl = right.left
rightr = right.rightif(
...)
有點遞迴的意思了。
那我們先寫乙個比較**:
boolean
cmp(treenode a, treenode b)
if(a.val == b.val)
}else
if(a== null && b == null)
else
}
boolean
cmp(treenode a, treenode b)
if(a.val == b.val)
}else
if(a== null && b == null)
else
}
全部**如下:
class
solution
if(a.val == b.val)
}else
if(a== null && b == null)
return
false;}
public
boolean
issymmetric
(treenode root)
treenode left = root.left;
treenode right = root.right;
return
cmp(left, right);}
}
非遞迴怎麼寫?
之前我說,可能要記錄層數才能做到按照某種順序(如中序)輸出,但是這樣還不行。我們知道,僅靠中序遍歷是不能得到乙個樹的,可能許多不同的樹中序遍歷後都是乙個順序。所以只能另想它法。
既然存值不行,那我們就存節點。將節點按照某種順序存進陣列中,再判斷兩個陣列是否是相同值。
class
solution
if(root.left == null && root.right == null)
if(root.left == null || root.right == null)
if(root.left != null && root.right != null)
while
(!left.
isempty()
&&!right.
isempty()
)if(l != null && r != null && l.val != r.val)
if(l == null || r == null)
left.
offer
(l.left)
; left.
offer
(l.right)
; right.
offer
(r.right)
; right.
offer
(r.left);}
return
true;}
}
leetcode 二叉樹 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3 但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3 方法一 遞迴 思路 如果乙個樹的左子樹與右子樹映象對稱,則該樹是對稱的 兩個樹互為映象的...
LeetCode 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3class solution public boolean issymmetricdoubl...
LeetCode 對稱二叉樹
我的解決方案 比較笨拙,我直接按照左後根遍歷一遍,然後再按照右後根遍歷一遍,最後比較結果 class treenode public class solution string ltreetostring tree.left,string string ltreetostring tree.righ...