输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
- 二叉搜索树的中序遍历结果就是从小到大的序列
- 二叉搜索树的每一个节点都有左右两个指针,双向链表每个节点都有前后两个指针
- 规定,树的左指针指前面的节点,右指针指后面的节点,利用树的中序遍历改变指针的指向即可。
执行完这个操纵之后,此时lastNode指向双向链表的右边,因为牛客网的判题系统就是要先从左向右遍历,再从右向左遍历,所以这里得将lastNode指针移动到链表的最左边
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
TreeNode lastNode = null;
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null) {
return null;
}
find(pRootOfTree);
while(lastNode.left != null){
lastNode = lastNode.left;
}
return lastNode;
}
private find(TreeNode pRootOfTree){
TreeNode pCurrent = pRootOfTree;
if (pCurrent.left != null) {
find(pCurrent.left);
}
pCurrent.left = lastNode;
if (lastNode!=null) {
lastNode.right = pCurrent;
}
lastNode = pCurrent;
if (pCurrent.right != null) {
find(pCurrent.right);
}
}
}