原题链接
描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示
注意:
1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继
2.返回链表中的第一个节点的指针
3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构
4.你不用输出或者处理,示例中输出里面的英文,比如"From left to right are:"这样的,程序会根据你的返回值自动打印输出
示例1
输入:{10,6,14,4,8,12,16}
返回值:From left to right are:4,6,8,10,12,14,16;From right to left are:16,14,12,10,8,6,4;
示例2
输入:{5,4,#,3,#,2,#,1}
返回值:From left to right are:1,2,3,4,5;From right to left are:5,4,3,2,1;
说明:
5
/
4
/
3
/
2
/
1
树的形状如上图
思路
主要是中序遍历,然后在遍历结点时更改指针方向。一般来说二叉搜索树的中序遍历结果就已经是一个排序的列表了,但要求是双向链表,所以每次要保存上一个结点。
解答
import java.util.Stack;
public class Solution {
public static TreeNode Convert(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 是 pre 的后继结点
p.left = pre;// pre 是 p 的前驱节点
pre = p;
}
p = p.right;
}
return root;
}
}