题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:
1、二叉搜索树转成双向链表时,从最左边开始,到父节点,再到右子树,符合中序遍历
2、转换成双向链表时,节点有左右两个节点引用,可将节点的右节点指向下一个节点,左节点指向上一个节点
3、当访问节点时,为了形成链表,确定指向,应访问当前节点时,保存上一个访问的节点
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
TreeNode previous = null;
public TreeNode Convert(TreeNode pRootOfTree) {
if(null == pRootOfTree)
return null;
convertTo(pRootOfTree);
return getLeftLastNode(pRootOfTree);
}
public TreeNode getLeftLastNode(TreeNode root){ //获取最左节点
TreeNode leftLast = root;
while(leftLast.left!=null){
leftLast = leftLast.left;
}
return leftLast;
}
public void convertTo(TreeNode current){
if(current!=null){
convertTo(current.left);
if(previous != null){ //previous的右节点为当前节点,当前节点的左节点为previous
previous.right = current;
current.left = previous;
}
previous = current; //previous保存访问过的上一个节点
convertTo(current.right);
}
}
}