這個題拿到手上,第乙個思考的就是:如何正確的去解讀「映象對稱」。第乙個想法就是:既然每個形態不同的樹,中序遍歷結果不同,那麼直接對樹進行中序遍歷,然後比較陣列是否對稱即可。
如上述問題描述中,第乙個例子的中序遍歷為:【3,2,4,1,4,2,3】,顯然以中點對稱。
第二個例子的中序遍歷為:【2,3,1,2,3】,那麼無法滿足要求。
正當我興高采烈地秒完中序遍歷直接提交時,出錯了。。。
當面對這個樹時,中序遍歷結果是對稱的。
究其原因,是由於中序遍歷結果把 null 忽略掉沒有記錄。
假如上面這個樹的輸出為:【2,2,n,1,2,2,n】,那麼輕鬆的就可以判定這也不是對稱的。
然而,如何在遞迴過程中寫出,能夠記錄 null 的**,我沒有能夠實現。因為遞迴就是靠 null 來判斷邊界的,我沒法去利用這個值。
看完答案後,發覺是自己把自己的思路禁錮住了。
既然要判斷對稱,那麼要求便是:左子樹與右子樹對稱。
對稱的要求是:
1. 左子樹的左孩子等於右子樹的右孩子
2. 左子樹的右孩子等於右子樹的左孩子
邊界條件:
1 . 左子樹與右子樹同時為空
2 . 左右子樹有一者為空
3 . 左右子樹值不相同
顯然,要求是收斂的,存在邊界,那麼可以寫新的遞迴,遞迴引數即為左右子樹根
public
class
solution2
public
boolean
isequal
(treenode left, treenode right)
}
非遞迴寫法,直接借用乙個容器,來儲存左右子樹對應位置的節點。結束迴圈的邊界即為:容器為空—樹遍歷結束。
public
class
solution3
if(left == null || right == null)
if(left.val != right.val)
stack.
add(left.left)
; stack.
add(right.right)
; stack.
add(left.right)
; stack.
add(right.left);}
return
true;}
}
不一定要用棧,佇列也可以。 LeetCode 101 對稱二叉樹
給定乙個二叉樹,檢查它是否是它自己的映象 即,圍繞它的中心對稱 例如,這個二叉樹 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(101) 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 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說明 如果你可以運用遞迴和迭代兩種方法解決這個問題,會很加分。這道題也是劍指offer上的2...
leetcode 101 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 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思路 如果同時滿足下面的條件,兩個樹互為映象 它們的兩個根結點具有相同的值。每個樹的右子樹都...