描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示
数据范围:输入二叉树的节点数 0 \le n \le 10000≤n≤1000,二叉树中每个节点的值 0\le val \le 10000≤val≤1000
要求:空间复杂度O(1)O(1)(即在原树上操作),时间复杂度 O(n)O(n)
我的解法:
二叉搜索树的中序遍历正好为排序的结果,通过中序遍历,递归过程中,通过pre节点保存上一节点数据,完成转换
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
TreeNode pre = null;
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null)
return null;
a(pRootOfTree);
TreeNode p = pRootOfTree;
while (p.left != null) {
p = p.left;
}
return p;
}
//按照中序遍历正好是排序的 4 6 8 10 12 14 16
public void a(TreeNode root){
if(root==null){
return;
}
a(root.left);
root.left=pre;//当前节点的左边指向上一个节点
if(pre!=null){
pre.right=root;//如果上一个节点不为空,让上一个节点的右边指向当前节点
}
pre=root;//设置新的节点
a(root.right);
}