標簽: 算法
初始描述:輸入一棵二叉搜索樹,將其轉換為一個排序的雙向鏈表。要求:不能創建任何新的結點,只能調整樹中結點指針的指向。
思路:
- 二叉搜索樹的特性是,其中序遍歷是有序的,同時左子樹的元素都比根結點小,右子樹的元素都比根節點大。
- 由上述特性可知,把二叉搜索樹轉換成雙向鏈表后,根節點的前一個元素是左子樹的最右邊結點,根結點的后一個元素是右子樹的最左邊結點。
- 左子樹和右子樹的轉換過程是一樣的,所以是一個遞歸的過程。
- 注意,轉換后返回的是指向雙向鏈表的頭指針。
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
// 根節點為空
if(pRootOfTree == null) return null;
if(pRootOfTree.left != null){
// 先轉換左子樹,獲得轉換后的頭指針
TreeNode left = Convert(pRootOfTree.left);
// 獲得指向左子樹的最后一個元素的指針
while(left.right != null) left = left.right;
// 與root鏈接,注意雙向
pRootOfTree.left = left;
left.right = pRootOfTree;
}
if(pRootOfTree.right != null){
// 同理,轉換右子樹
TreeNode right = Convert(pRootOfTree.right);
// 獲得指向右子樹的第一個元素的指針,這里直接就是right,與root雙向鏈接
pRootOfTree.right = right;
right.left = pRootOfTree;
}
// 最后把pRootOfTree指向雙向鏈表的第一個元素再返回
while(pRootOfTree.left != null){
pRootOfTree = pRootOfTree.left;
}
return pRootOfTree;
}
}
