輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。
要求不能建立任何新的結點,只能調整樹中結點指標的指向。
注意:需要返回雙向鍊錶最左側的節點。
例如,輸入下圖中左邊的二叉搜尋樹,則輸出右邊的排序雙向鍊錶。
方法一:
非遞迴實現,利用中序遍歷:
10
/ \
6 14
/\ /\
4 8 12 16
根據樹的結構知道,左子樹小於根右子樹大於根,
我們把樹轉化為雙鏈表就要從小到大排序其實,4 <=>6<=>8<=>10<=>12<=>14<=>16
對於左子樹和根,讓左子樹的right指向root,root的left指向左子樹 比如4<=>6這樣
但是對於右子樹,他的值要比root大,要讓右子樹的left指向root,而right要指向root的父親,
所以用堆疊,如果沒有右子,所有的根節點最後都做的是lastnode,一旦有右子就得放到棧頂並彈出,這樣剛好
在遍歷到當前節點的父節點之前,把右節點夾在中間,比如 6 和10 當6 做完pop後,如果沒有8
可能6的right指的就是10了,但是由於最後**有pnode = pnode.right 將6的right指向了8,由於8是葉子節點,此時下乙個節點就只能通過堆疊之前儲存的pop來得到10,
public static treenode convert(treenode root)
if(!stack.isempty())
lastnode = pnode;
pnode = pnode.right;}}
while(root.left!=null)
return root;
}
方法二:遞迴實現
還是中序遍歷,只不過用遞迴實現
要把pre設成乙個全域性的容器,要不不能實現
static treenode pre = null;
public static treenode convert(treenode root)
dfs(root);
treenode res = root;
while(res.left!=null)
return res;
}public static void dfs(treenode curr)
pre = curr;
dfs(curr.right);
}
二叉搜尋樹與雙向鍊錶
1.問題描述 輸入一顆二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。來自 劍指offer 2.分析 對於二叉搜尋樹我們知道,樹的左孩子都比根節點要下,樹的右孩子都比根結點要大,根據這個特點,我們進行中序遍歷得到的序列就會滿足題目的要求,我們...
二叉搜尋樹與雙向鍊錶
問題描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。演算法 struct binarytreenode binarytreenode convert binarytreenode prootoftree plastnodeinl...
二叉搜尋樹與雙向鍊錶
排序二叉樹與雙向鍊錶.cpp 定義控制台應用程式的入口點。題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 通過對一顆排序二叉樹的認識可知一顆排序二叉樹中序輸出就是有序的 通過後序遍歷讓子樹分別找到自己的left和rig...