输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
利用left作为双向链表的前驱指针,right作为双向链表的后驱指针,采用递归从子树开始转换。
package convertBSTtoDoubleLink;
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) {
helper(pRootOfTree);
TreeNode ret = pRootOfTree;
while(ret.left!=null)
ret = ret.left;
return ret;
}
public void helper(TreeNode pRootOfTree){
if(pRootOfTree==null || (pRootOfTree.left==null && pRootOfTree.right==null) )
return ;
if(pRootOfTree.left!=null){
helper(pRootOfTree.left);
TreeNode tmp1 = pRootOfTree.left;
while(tmp1.right!=null)
tmp1 = tmp1.right;
pRootOfTree.left = tmp1;
tmp1.right = pRootOfTree;
}
if(pRootOfTree.right!=null){
helper(pRootOfTree.right);
TreeNode tmp2 = pRootOfTree.right;
while(tmp2.left!=null)
tmp2 = tmp2.left;
pRootOfTree.right = tmp2 ;
tmp2.left = pRootOfTree;
}
}
// 打印测试
public void print(TreeNode ret){
TreeNode tmp = ret;
TreeNode tmp1 = ret;
while(tmp!=null){
System.out.print(tmp.val+" ");
if(tmp.right==null)
tmp1 = tmp;
tmp = tmp.right;
}
System.out.println();
while(tmp1!=null){
System.out.print(tmp1.val+" ");
tmp1 = tmp1.left;
}
}
public static void main(String[] args){
TreeNode pRoot = new TreeNode(10);
TreeNode root = new TreeNode(6);
TreeNode root2 = new TreeNode(14);
TreeNode l1 = new TreeNode(4);
TreeNode r1 = new TreeNode(8);
TreeNode ll1 = new TreeNode(12);
TreeNode rr1 = new TreeNode(16);
pRoot.left = root;pRoot.right=root2;
root.left = l1;
root.right = r1;
root2.left=ll1;root2.right=rr1;
Solution s = new Solution();
TreeNode ret = s.Convert(pRoot);
s.print(ret);
}
}