Leetcode 101 對稱二叉樹(心路歷程)

2021-10-09 09:17:04 字數 1402 閱讀 5394

這個題拿到手上,第乙個思考的就是:如何正確的去解讀「映象對稱」。第乙個想法就是:既然每個形態不同的樹,中序遍歷結果不同,那麼直接對樹進行中序遍歷,然後比較陣列是否對稱即可。

如上述問題描述中,第乙個例子的中序遍歷為:【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思路 如果同時滿足下面的條件,兩個樹互為映象 它們的兩個根結點具有相同的值。每個樹的右子樹都...