刷演算法 翻轉二叉樹的遞迴和非遞迴解法

2021-09-11 12:15:03 字數 1173 閱讀 6016

操作給定的二叉樹,將其變翻轉為源二叉樹的映象。

1                    1

/ \ / \

2 3 ——————> 3 2

/ \ / \ / \ / \

4 5 6 7 7 6 5 4

複製**

遞迴版本

首先,對資料結構比較了解的話會想到用遞迴來解決。 所謂遞迴,在電腦科學中是指一種通過重複將問題分解為同類的子問題而解決問題的方法(來自維基百科)。這個解釋還是比較教條的,對於工程師來說,首先要思考:

分解問題後的子問題是什麼,也就是重複的那一部分是什麼?

什麼時候結束重複?即終止條件是什麼

回到翻轉二叉樹的問題,我們梳理一遍整個翻轉過程:

root開始,交換root的left元素和root.right元素

root.left開始,交換root.left.left元素和root.left.right元素

root.right開始,交換root.right.left元素和root.right.right元素

......

複製**

可以看出來重複的部分是:交換x元素的left和right元素,用偽**表示為:

temp = x.left;

x.left = x.right;

x.right = temp;

複製**

那麼終止條件是什麼呢?很顯然是當元素為null時,它就談不上去交換左右子元素了,所以x=null時終止遞迴。 此時**就很好寫了:

function treenode(x)  

function mirror(root)

複製**

非遞迴版本

非遞迴版本可以從樹的層次遍歷上找到靈感,無非就是按照層來遍歷樹的節點,且一邊遍歷一邊交換當前節點的左右子節點,直到遍歷完畢就ok

function treenode(x)  

function mirror(root)

}

}複製**

刷演算法 翻轉二叉樹的遞迴和非遞迴解法

操作給定的二叉樹,將其變翻轉為源二叉樹的映象。1 1 2 3 3 2 4 5 6 7 7 6 5 4遞迴版本 首先,對資料結構比較了解的話會想到用遞迴來解決。所謂遞迴,在電腦科學中是指一種通過重複將問題分解為同類的子問題而解決問題的方法 來自維基百科 這個解釋還是比較教條的,對於工程師來說,首先要思...

遍歷二叉樹 遞迴和非遞迴演算法

遍歷二叉樹的三種方法 前序 根節點 左子樹 右子樹 中序 左子樹 根節點 右子樹 後序 左子樹 右子樹 根節點 非遞迴演算法中序遍歷二叉樹,設s為乙個棧,p為指向根節點的指標,處理過程如下 1 當p非空時,壓棧p指標,並將p指向該節點的左子樹。2 當p為空時,彈出棧頂元素,顯示節點元素,並將p指向該...

遍歷二叉樹 遞迴和非遞迴演算法

遍歷二叉樹的三種方法 前序 根節點 左子樹 右子樹 中序 左子樹 根節點 右子樹 後序 左子樹 右子樹 根節點 非遞迴演算法中序遍歷二叉樹,設s為乙個棧,p為指向根節點的指標,處理過程如下 1 當p非空時,壓棧p指標,並將p指向該節點的左子樹。2 當p為空時,彈出棧頂元素,顯示節點元素,並將p指向該...