题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解题思路
- 二叉搜索树的中序遍历结果就是排好序的,所以二叉搜索树转换成排好序的双向 链表是可以实现的。
- 把二叉搜索树划分为三个部分:左子树,根节点,右子树;(划分为三个部分)
- 这三个部分中每个部分都是排好序的,所以我们考虑的是怎么连接的问题,也就是寻找排好序的链表中的最后一个结点的问题;(寻找最后一个结点进行连接)
- 左子树和右子树上递归调用上述两步。
代码
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
//定义排好序的链表中最后一个结点
TreeNode lastNodeList=null;
lastNodeList=ConvertNode(pRootOfTree,lastNodeList);
//需要返回头结点
while(lastNodeList!=null && lastNodeList.left!=null){
lastNodeList=lastNodeList.left;
}
return lastNodeList;
}
//左子树,根节点和右子树排好序的链表中最后一个结点
public TreeNode ConvertNode(TreeNode pRootOfTree,TreeNode lastNodeList){
if(pRootOfTree==null){
return null;
}
TreeNode current=pRootOfTree;
if(current.left!=null){
lastNodeList=ConvertNode(current.left,lastNodeList);//排好序的左子树上最后一个节点
}
current.left=lastNodeList;//根节点的左边是左子树上最后一个结点
if(lastNodeList!=null){
lastNodeList.right=current;//左子树上最后一个结点的下一个是根节点(左子树和根节点排好序了)
}
lastNodeList=current;//现在已经排好序的最后一个结点是根节点
if(current.right!=null){
lastNodeList=ConvertNode(current.right,lastNodeList);
}//排右子树上的节点,返回链表的最后一个结点
return lastNodeList;
}
}