LeetCode對稱二叉樹

2021-10-25 12:42:40 字數 2937 閱讀 1600

給定乙個二叉樹,檢查它是否是映象對稱的。

例如,二叉樹 [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.leftroot.right,然後比較root.left.leftroot.right.rightroot.left.rightroot.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...