【题目描述】输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
注:不能创建新的结点,理解为不能显式的new一个出来。
【解题思路】
//1. 利用中序遍历的思想来完成。
//2. 给定一个指针用来存储中序遍历的第一个节点,作为双向链表的头指针。
//3. 对于遍历到的当前节点,若是第一个节点,则存储起来。否则,将上一个节点的右指针指向当前节点,将当前节点的左指针指向上一个节点。同时将当前节点存储为上一个节点,并继续遍历。
//递归实现
public class Solution {
private TreeNode head; //中序遍历中上一个节点
private TreeNode tail; //记录中序遍历中第一个节点,即链表的头结点。
public TreeNode Convert(TreeNode pRootOfTree) {
inOrder(pRootOfTree);
return tail;
}
public void inOrder(TreeNode root){
if(root == null){
return;
}
if(root.left != null){
inOrder(root.left);
}
if(head == null){
head = root;
tail = root;
}else{
head.right = root;
root.left = head;
head = root;
}
if(root.right != null){
inOrder(root.right);
}
}
}
//非递归实现
import java.util.Stack;
public TreeNode ConvertBSTToBiList(TreeNode root) {
if(root==null)
return null;
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode p = root;
TreeNode pre = null;// 用于保存中序遍历序列的上一节点
boolean isFirst = true;
while(p!=null||!stack.isEmpty()){
while(p!=null){
stack.push(p);
p = p.left;
}
p = stack.pop();
if(isFirst){
root = p;// 将中序遍历序列中的第一个节点记为root
pre = root;
isFirst = false;
}else{
pre.right = p;
p.left = pre;
pre = p;
}
p = p.right;
}
return root;
}