将二叉搜索树转为排序的双向链表
原题:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
/*
* 递归方法:
* 由于题目要求排序的双向列表,所以首先将二叉搜索树中序遍历,这里采用一个队列来存放要排序的节点,每访问一个节点将其
* 入队,最后全部入队后队列里面是排好序的节点,队首是值最小的节点。然后开始出队,每出队一个元素,将该元素的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);
}
}
}