输入一棵二叉搜索树,
将该二叉搜索树转换成一个排序的双向链表。
要求不能创建任何新的结点,只能调整树中结点指针的指向。
创建的双向链表的顺序就是二叉搜索树的中序遍历结果。
这里有递归和非递归解法。一般的非递归解法需要开辟额外的空间,本次借助Morris算法,给出一种不需要额外空间开销的非递归解法。
首先是递归
TreeNode lastLeft = null;
public TreeNode Convert(TreeNode pRootOfTree) {
TreeNode root = pRootOfTree;
if(root==null) return null;
if(root.left==null&& root.right==null) {
lastLeft = root;
return root;
}
TreeNode left = Convert(root.left);
if(left!=null){
lastLeft.right = root;
root.left = lastLeft;
}
lastLeft = root;
TreeNode right = Convert(root.right);
if(right!=null){
root.right = right;
right.left = root;
}
return left==null?root:left;
}
这里lastLeft,记录的是左子数中最后一个节点。
非递归的Morris算法的改版
public TreeNode ConvertMorris(TreeNode pRootOfTree) {
TreeNode head = pRootOfTree;
if(head==null) return head;
TreeNode cur1 = head;
TreeNode cur2 = null;
TreeNode pre = null;
TreeNode res = null;
while(cur1!=null){
cur2 = cur1.left;
if(cur2!=null){
while(cur2.right!=null && cur2.right!=cur1){
cur2 = cur2.right;
}
if(cur2.right==null){
cur2.right = cur1;
cur1 = cur1.left;
continue;
}
}
if(res==null){
res = cur1;
}
cur1.left=pre;
if(pre!=null)
pre.right = cur1;
pre = cur1;
cur1 = cur1.right;
}
return res;
}