遞迴和迭代方式判斷二叉樹是否映象對稱小結

2021-10-06 06:41:54 字數 1772 閱讀 8857

二叉樹的一些問題,一般都能採用遞迴和迭代兩種方式去解決。

首先,***方式一:遞迴。

採用遞迴解決問題,通常我們可以分解出三個角度去得出解題思路。

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...