题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
例如:按顺序输入10,6,14,4,8,12,16。从左到右输出:4,6,8,10,12,14,16,从右到左输出:16,14,12,10,8,6,4。
思路:左右子树分开排。
/**
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;
visitLeft(null, pRootOfTree, pRootOfTree.left, 0);
visitRight(null, pRootOfTree, pRootOfTree.right, 1);
return findHead(pRootOfTree);
}
public void visitLeft(TreeNode ppre, TreeNode pre, TreeNode root, int flag) {
if(root == null) return ;
visitLeft(pre, root, root.left, 0);
visitLeft(pre, root, root.right, 1);
if(flag == 0 && root.right == null) {
root.right = pre;
}
if(flag == 1) {
root.left = pre;
root.right = ppre;
ppre.left = root;
}
}
public void visitRight(TreeNode ppre, TreeNode pre, TreeNode root, int flag) {
if(root == null) return ;
visitRight(pre, root, root.left, 0);
visitRight(pre, root, root.right, 1);
if(flag == 1 && root.left == null) {
root.left = pre;
}
if(flag == 0) {
root.right = pre;
root.left = ppre;
ppre.right = root;
}
}
public TreeNode findHead(TreeNode root) {
if(root.left == null) return root;
else return findHead(root.left);
}
}