题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路
对二叉树进行一次中序遍历得到一个有序的序列,使用队列保存二叉树中序遍历后的序列。再通过每次在队列中弹出一个元素生成双向链表的每个节点来生成完整的双向链表。
代码实现
import java.util.*;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree == null){
return null;
}
//使用队列保存树中序遍历的结果
Queue <Integer> queue = new LinkedList<>();
inOrder(pRootOfTree, queue);
int headVal = queue.poll();
TreeNode pre = new TreeNode(headVal);
TreeNode head = pre;
pre.left = null;
pre.right = null;
if(queue.isEmpty()){
return head;
}
TreeNode cur = null;
while(!queue.isEmpty()){
int x = queue.poll();
cur = new TreeNode(x);
pre.right = cur;
cur.left = pre;
pre = cur;
}
cur.right = null;
return head;
}
private void inOrder(TreeNode head, Queue<Integer> queue){
if(head == null){
return;
}
inOrder(head.left, queue);
queue.offer(head.val);
inOrder(head.right, queue);
}
}