題目描述:輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。
public class treenode
}
思路一:遞迴
1.將左子樹構造成雙鏈表,並返回煉表頭節點。
2.定位至左子樹雙鏈表最後乙個節點。
3.如果左子樹煉表不為空的話,將當前prootoftree追加到左子樹鍊錶。
4.將右子樹構造成雙鏈表,並返回煉表頭節點。
5.如果右子樹煉表不為空的話,將該鍊錶追加到prootoftree節點之後。
6.根據左子樹鍊錶是否為空確定返回的節點。
public class solution
//將右子樹構造成雙鏈表,並返回煉表頭節點
treenode right = convert(prootoftree.right);
if (right != null)
return left == null ? prootoftree:left;
}}
思路二:遞迴,僅對第2點中的定位作了修改,新增乙個全域性變數記錄左子樹的最後乙個節點。
public class solution
treenode left = convert(prootoftree.left);
if (left != null)
leftlast = prootoftree;
treenode right = convert(prootoftree.right);
if (right != null)
return left != null?left:prootoftree;
}}
思路三:中序遍歷,遞迴
public class solution
convert(prootoftree.right);
return lefthead;
}}
思路四:非遞迴
public class solution
if (!stack.isempty())
p = stack.pop();
if (isfirst)
else
p = p.right;
}return prootoftree;
}}
二叉搜尋樹與雙向鍊錶
1.問題描述 輸入一顆二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。來自 劍指offer 2.分析 對於二叉搜尋樹我們知道,樹的左孩子都比根節點要下,樹的右孩子都比根結點要大,根據這個特點,我們進行中序遍歷得到的序列就會滿足題目的要求,我們...
二叉搜尋樹與雙向鍊錶
問題描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。演算法 struct binarytreenode binarytreenode convert binarytreenode prootoftree plastnodeinl...
二叉搜尋樹與雙向鍊錶
排序二叉樹與雙向鍊錶.cpp 定義控制台應用程式的入口點。題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 通過對一顆排序二叉樹的認識可知一顆排序二叉樹中序輸出就是有序的 通過後序遍歷讓子樹分別找到自己的left和rig...