描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示
数据范围:输入二叉树的节点数 0 \le n \le 10000≤n≤1000,二叉树中每个节点的值 0\le val \le 10000≤val≤1000
要求:空间复杂度O(1)O(1)(即在原树上操作),时间复杂度 O(n)O(n)
public class ConvertTree {
static class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
TreeNode pre2 = null;
TreeNode root2 = null;
public TreeNode Convert2(TreeNode pRootOfTree){
if(pRootOfTree == null){
return null;
}
Convert2(pRootOfTree.left);
if(null == root2){
root2 = pRootOfTree;
}
if(null != pre2){
pre2.right = pRootOfTree;
pRootOfTree.left = pre2;
}
// 移动到下一个节点
pre2 = pRootOfTree;
Convert2(pRootOfTree.right);
return root2;
}
/*
二叉搜索树,左边一直递归
要有一个前驱pre节点。 递归到上一级的时候 root 就是pre的后继。
最终若返回pre,那么是降序排列,题干要求升序,故保存第一个节点,返回第一个节点。
*/
TreeNode pre= null;
TreeNode root=null;
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree ==null) {
return null;
}
Convert(pRootOfTree.left);
if(root == null){
root=pRootOfTree;
}
if(pre!=null){
pRootOfTree.left=pre;
pre.right=pRootOfTree;
}
pre=pRootOfTree; // pre指向下一个节点
Convert(pRootOfTree.right);
return root;
}
public static void main(String[] args) {
//System.out.println("main...");
}
}