題目描述:
給定乙個二叉樹,原地將它展開為鍊錶。
例如,給定二叉樹
1/ \
2 5
/ \ \
3 4 6
將其展開為:1\
2\3\
4\5\
6大體思路:
由上述結果可以看出,可以自然而然的想到通過改寫二叉樹的先序遍歷解決該問題。
定義一遞迴函式step(treenode root) : treenode
輸入當前結點,完成以當前結點作為有節點子樹的展開,並且返回展開後最末尾的結點。
step()內部,只需要先完成左子樹的展開,接著完成右子樹的展開,再將左子樹展開的鍊錶接到頭結點之後,將右子樹展開的鍊錶接到左子樹展開的鍊錶之後即可完成子樹的展開。最後返回右子樹的尾結點
不過對於step()的實現還需要考慮邊界值,與左右子樹不存在的情況。
具體實現**如下:
/**
* 可以看出轉換是以先序的順序完成,因此可以通過改寫二叉樹的先序遍歷
* 設計遞迴函式step(treenode root):+treenode
* 輸入該數的頭結點,完成轉換,並且返回轉換後的尾結點
* 因此只需要對於某一結點完成左子樹轉換,再完成右子樹的轉換,
* 最後將左子樹拼接到頭結點後面,右子樹拼接到左子樹後面 返回右子樹的尾結點即可
* @param root 頭結點
* @return 拼接後的尾結點
*/public treenode step(treenode root)
treenode last = root;
treenode left = root.left;
treenode right = root.right;
if(left != null)
if(right != null)
root.left = null;
return last;
}
二叉樹展開為鍊錶
給定乙個二叉樹,原地將它展開為鍊錶。例如,給定二叉樹 將其展開為 以根節點為基準,先處理左子樹,然後處理右子樹,當其左右子樹均轉化為鍊錶之後,再處理以該根節點所代表的樹,將其右子樹賦給臨時變數,設root.right root.left,並將左子樹置空,然後將臨時變數賦給root.right。pub...
二叉樹展開為鍊錶
給定乙個二叉樹,原地將它展開為鍊錶。例如,給定二叉樹 1 2 5 3 4 6 將其展開為 1 2 3 4 5 6解法1 前序遍歷,1.先儲存舊的右子樹,2.把左子樹賦值給root.right,把左子樹置為nil 3.遍歷找到最右邊的節點,把舊的右子樹接到最右邊的葉子節點上 4.根節點處理完成,向下遞...
二叉樹展開為鍊錶
給定乙個二叉樹,原地將它展開為鍊錶。例如,給定二叉樹 1 2 5 3 4 6將其展開為 1 2 3 4 5 6 解法解法一 1.對樹進行先序遍歷,把每遍歷乙個節點就將該節點入隊 2.遍歷完之後,對佇列進行出隊操作 3.每齣乙個節點,就將該節點的left指標置為null,右指標指向下乙個出隊的節點 d...