題目:給定一棵二叉樹,判定它是否是映象對稱的。
如下是一棵映象二叉樹。
1
/ \ 2
2/ \ / \34
43
我最開始的想法是這樣的, 如下
/**
* 對稱二叉樹
*/public
boolean
issymmetric
(treenode root)
treenode t1 = root.left;
treenode t2 = root.right;
if(t1 == null && t2 == null)
if(t1 == null || t2 == null)
// 當前節點的左右子節點不相同
if(t1.val != t2.val)
// 在這裡就要比較t1.left與t2.right的關係了。
// 但這裡進行不下去了, 想不清楚了。
// 因為互為映象要考慮兩個節點的比較,而此方法只有乙個引數,所以遞迴呼叫比較困難。
return
true
;}
在後面的t1.left與t2.right,t1.right與t2.left的比較的時候就想不清楚了。因為該方法只有乙個引數,只能傳乙個節點進去,而方法中比較的都是當前節點的左右子節點的關係,無法比較與兄弟節點的比較。於是思維混亂了,陷入沉思中…
經過一番掙扎後,還是決定看了官方的解答。果然是一看就會,一做就廢。
官方解答的聰明之處就是新定義了一方法,作用是判定兩個節點是否互為映象, 如下:
/**
* 兩棵樹是否為映象
* @param t1
* @param t2
* @return
*/public
boolean
ismirror
(treenode t1, treenode t2)
// t1 或 t2 有乙個為空
if(t1 == null || t2 == null)
// 經過上面兩個判斷 t1 與 t2均不為null
if(t1.val != t2.val)
// 遞迴呼叫判斷t1.left與t2.right t1.right與t2.left的關係。
return
ismirror
(t1.left, t2.right)
&&ismirror
(t1.right, t2.left)
;}
然後在根節點處呼叫,如下:
/**
* 對稱二叉樹
*/public
boolean
issymmetric
(treenode root)
return
ismirror
(root.left, root.right)
;}
由於需要對樹中的所有的節點遍歷,遞迴呼叫的時間複雜度為o(n)。空間複雜度與樹的高度有關,而樹的高度最差的情況是線性的,故空間複雜度最差的情況是o(n)。
除此之外,官方還提供了乙個迭代的解法,在此記錄一下,看過之後就覺得很巧妙,即用乙個佇列記錄節點,按照比對的順序入隊,出隊時取出兩個元素比較。 如下:
/**
* 對稱二叉樹
*/public
boolean
issymmetric
(treenode root)
if(t1 == null || t2 == null)
if(t1.val != t2.val)
// 注意這裡的加入佇列的順序,因為linklist可以存放空值,故此處沒有加入檢驗。
queue.
add(t1.left)
; queue.
add(t2.right)
; queue.
add(t1.right)
; queue.
add(t2.left);}
return
true
;}
此方法的時間與空間複雜度均為o(n)。 判斷二叉樹是否對稱
題目描述 time limit 1000 ms memory limit 256 mb 層次遍歷的方式輸入乙個二叉樹,判斷這個二叉樹的結構 即不用管結點的值 是否映象對稱。輸入輸出格式 輸入描述 輸入一行字母,其中 表示空節點 字母長度小於1000 輸出描述 如果輸入的二叉樹對稱,輸出yes,否則輸...
判斷二叉樹是否是對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 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 遞迴實現 需要滿足兩個子樹 根節點值相同 根節點1的左子樹與根節點2右子樹相同 根節點1...
對稱二叉樹c 對稱的二叉樹
很簡單,關鍵還是知道怎麼樣才能判斷乙個 二叉樹是否對稱,只要採用前序 中序 後序 層次遍歷等任何一種遍歷方法,分為先左後右和先 右後左兩種方法,只要兩次結果相等就說明這棵樹是一顆對稱二叉樹。迭代版本 class solution public bool issymmetric treenode ro...