將二叉搜索樹轉爲排序的雙向鏈表
原題:輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。
/*
* 遞歸方法:
* 由於題目要求排序的雙向列表,所以首先將二叉搜索樹中序遍歷,這裏採用一個隊列來存放要排序的節點,每訪問一個節點將其
* 入隊,最後全部入隊後隊列裏面是排好序的節點,隊首是值最小的節點。然後開始出隊,每出隊一個元素,將該元素的right指向
* 隊首元素,將隊首元素的left指向剛纔出隊的那個元素。直到隊列中只有1個元素時,這時雙向列表已經已經鏈接好了,但是題目裏面唯一
* 提供的一個引用還在鏈表尾部,所以再將該引用通過循環指向雙向鏈表頭部那個最小的節點並返回,OK,我的這種方法應該是比較好理解的。
*/
import java.util.LinkedList;
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
//創建一個空隊列
LinkedList<TreeNode> queue=new LinkedList<TreeNode>();
if(pRootOfTree==null) return null;
else inRootTraverse(pRootOfTree, queue);
while(queue.size()>1){
pRootOfTree=queue.poll();//隊首節點出隊
pRootOfTree.right=queue.peek();
queue.peek().left=pRootOfTree;
}
//由於題目不讓創建新的節點,而現在題目提供的引用指向列表尾部,所以只能將提供的引用指向鏈表首部
while(pRootOfTree.left!=null) pRootOfTree=pRootOfTree.left;
return pRootOfTree;
}
//中序遍歷二叉搜索樹
public void inRootTraverse(TreeNode root,LinkedList<TreeNode> queue){
if(root!=null){
inRootTraverse(root.left, queue);
queue.add(root);//入隊
inRootTraverse(root.right, queue);
}
}
}