動畫:面試必刷之對稱的二叉樹

動畫:面試必刷之對稱的二叉樹

題目面試

請實現一個函數,用來判斷一顆二叉樹是否是對稱的。注意,若是一個二叉樹同此二叉樹的鏡像是一樣的,定義其爲對稱的。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

動畫:面試必刷之對稱的二叉樹

測試用例

  • 對稱二叉樹、不對稱二叉樹(結點數量不對稱、結點結構不對稱) —— 普通測試
  • 全部結點值都相同的二叉樹 —— 特殊測試
  • 空二叉樹 —— 輸入測試
相關文章
相關標籤/搜索