題目面試
請實現一個函數,用來判斷一顆二叉樹是否是對稱的。注意,若是一個二叉樹同此二叉樹的鏡像是一樣的,定義其爲對稱的。ide
如圖:函數
問題分析測試
仔細觀察上圖的對稱二叉樹,咱們能夠嘗試着從中間線的左邊和右邊作一個對比,咱們先打算用遞歸能不能解決,嗯,能夠,可是遞歸的前提咱們要搞明白下面所說的一種思路。動畫
咱們要想到遍歷,其中,前序遍歷的遍歷規則是根、左、右。咱們這時候靈機一動,咱們對於對稱二叉樹來講,咱們把規則變一下,變成根、右、左。若是此時是對稱二叉樹的話,這兩種遍歷的結果是相等的。不然,則不是對稱二叉樹。code
PS:可是有種狀況除外,儘管不是對稱二叉樹,遍歷的結果也是相同的,節點缺失的狀況。以下圖:blog
動畫實現遞歸
解決思路ip
首先,傳入二叉樹,判斷傳入的二叉樹是否爲空節點。it
1const isSymmetrical = (root)=>{ 2 // 判斷根節點是否爲空 3 if(root == null){ 4 return true; 5 } 6 return Symmetric(root.left,root.right); 7}
而後開始傳入一個函數,對比對稱的節點值是否相同,可是咱們要想到若是節點爲空的狀況。
若是兩個節點同時爲空,咱們斷定爲它是對稱的節點。若是其中一個爲空其中一個不爲空,則兩個節點不對稱。
1 // 判斷左右子樹是否爲空 2 if(left == null && right == null){ 3 return true; 4 } 5 6 // 其中一個子節點是空 7 if(left == null || right == null){ 8 return false; 9 }
若是兩個對稱節點不爲空的話,咱們就比較兩個對稱節點的值是否相同。
1 // 判斷兩個節點的值是否相同 2 if(left.data == right.data){ 3 return true; 4 }
而後咱們開始對剩下的節點進行遞歸遍歷判斷是否爲對稱節點。
1// 遞歸判斷 2 return Symmetric(left.left,right.right) && Symmetric(left.right,right.left);
代碼實現
JavaScript
Java
Python
測試用例