题目
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路
二叉搜索树按照中序遍历即为递增排列,按照分治法的思路,我们只需调整左子树的最大节点与根节点的关系、根节点与右子树的最小节点的关系。具体分为三步:
1.最大节点在左子树中:递归调用左子树;
2.最大节点为根节点;
3.最大节点在右子树中:递归调用右子树;
其中,第一步需要注意当前最大节点为空的情况(lastNode==null)。第二步连接最大节点与根节点(两种情况)。
代码
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null){
return null;
}
helper(pRootOfTree,null);
TreeNode start=pRootOfTree;
while(start.left!=null){
start=start.left;
}
return start;
}
private TreeNode helper(TreeNode pRootOfTree,TreeNode lastNode){
//处理左子树,获得最大结点
if(pRootOfTree.left!=null){
lastNode=helper(pRootOfTree.left,lastNode);//1
}
//链接最大结点和根结点
pRootOfTree.left=lastNode;
if(lastNode!=null){
lastNode.right=pRootOfTree;
}
//获得最大结点
lastNode=pRootOfTree;//2
//处理右子树,获得最大结点
if(pRootOfTree.right!=null){
lastNode=helper(pRootOfTree.right,lastNode);//3
}
return lastNode;
}
}
测试用例
功能测试(普通二叉树;左/右斜树;一个节点)。
特殊输入测试 (根节点为null)。