二叉樹的一些問題,一般都能採用遞迴和迭代兩種方式去解決。
首先,***方式一:遞迴。
採用遞迴解決問題,通常我們可以分解出三個角度去得出解題思路。
1.明確遞迴結束條件
2.明確遞迴過程
3.明確短路的條件***
現在我們針對判斷二叉樹是否映象對稱的問題,套用一下。
題目描述:
給定乙個二叉樹,檢查它是否是映象對稱的。
例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。
1
/ |
2 2/ \ / |
3443
但是下面這個 [1,2,2,null,3,null,3] 則不是映象對稱的:
1
/ 、
2 2\ 、
3 3/**
思路:
遞迴結束條件:
*如果根節點為null 則返回true;
*a節點為null &&b節點為null 則返回true;
*如果a或者b其中乙個為null,則返回false;
遞迴過程:
*判斷a,b的val值是否相等。
*判斷 a 的右子樹與 b 的左子樹是否對稱
*判斷 a 的左子樹與 b 的右子樹是否對稱
短路條件:
在遞迴判斷過程中存在短路現象,也就是做 與 操作時,如果前面的值返回 false 則後面的不再進行計算
主要**實現:
public
boolean
issymmetric
(treenode root)
public
boolean
ismirror
(treenode a,treenode b)
複雜度分析
時間複雜度:o(n),因為我們遍歷整個輸入樹一次,所以總的執行時間為 o(n),其中 n 是樹中結點的總數。
空間複雜度:遞迴呼叫的次數受樹的高度限制。在最糟糕情況下,樹是線性的,其高度為 o(n)。因此,在最糟糕的情況下,由棧上的遞迴呼叫造成的空間複雜度為 o(n)。此處存疑。
方式二:迭代。
思路:除了遞迴的方法外,我們也可以利用佇列進行迭代
主要就是保證佇列中需要比對的兩個值連續。每次取出兩個值進行比較,如不相等,或者隊列為空時,結束迭代。
具體來說,佇列中每兩個連續的結點應該是相等的,而且它們的子樹互為映象。最初,佇列中包含的是 root 以及 root。每次提取兩個結點並比較它們的值。然後,將兩個結點的左右子結點按相反的順序插入佇列中。當隊列為空時,或者我們檢測到樹不對稱(即從佇列中取出兩個不相等的連續結點)時,該演算法結束。
主要**實現:
public
boolean
issymmetric
(treenode root)
return
true
;}
複雜度分析
時間複雜度:o(n),因為我們遍歷整個輸入樹一次,所以總的執行時間為 o(n),其中 n 是樹中結點的總數。
空間複雜度:搜尋佇列需要額外的空間。在最糟糕情況下,我們不得不向佇列中插入 o(n)個結點。因此,空間複雜度為 o(n).
參考文件:
判斷二叉樹是否平衡 是否完全二叉樹 是否二叉排序樹
1.判斷二叉樹是否平衡 求樹的高度 int treedepth node t return0 判斷二叉樹是否平衡 int isbalanced node t 2.判斷二叉樹是否相同 判斷兩棵二叉樹是否相同 int comptree node tree1,node tree2 拷貝二叉樹 void c...
對稱二叉樹(遞迴 迭代)
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 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說明 如果你可以運用遞迴和迭代兩種方法解決這個問題,會很加分。寫乙個遞迴函式,當且僅當兩個節...
LC101 判斷是否是對稱二叉樹 遞迴 迭代
題目 給定乙個二叉樹,檢查它是否是映象對稱的。思路 判斷二叉樹是否對稱 遞迴class solution return ismirror root.left,root.right public boolean ismirror treenode root1,treenode root2 if roo...