迷茫,是青春最真实的状态;但奋斗,才是青春的主基调;努力是打败焦虑的绝好方法!
897. 递增顺序搜索树
给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。
示例一:

输入:root = [5,3,6,2,4,null,8,1,null,null,null,7,9]
输出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]
示例二:

输入:root = [5,1,7]
输出:[1,null,5,null,7]
提示
- 树中节点数的取值范围是 [1, 100]
- 0 <= Node.val <= 1000
解决方案&代码实现
先对树进行中序遍历,将值的相对位置都从小到大记录在一个list当中,然后,再重建一个二叉树
import java.util.*;
public class Solution {
//存储节点的数组
List<Integer> list=new ArrayList<>();
public TreeNode increasingBST(TreeNode root) {
//从根节点开始遍历存储
inorder(root);
//创建新树,空树
TreeNode result=new TreeNode(0);
//将根节点当作当前节点
TreeNode cur=result;
//遍历所有的节点
for(Integer val:list)
{
//加入到当前节点的右子树
cur.right=new TreeNode(val);
//将当前节点变为加入的右子树节点
cur=cur.right;
}
//只有右子树,返回创建的只有右子树的树
return result.right;
}
// 中序遍历树,将查找到的节点存储好
public void inorder(TreeNode node) {
//当前节点为空
if(node == null)
return;
//中序左子树
inorder(node.left);
//中序根,当前节点,保存节点
list.add(node.val);
//中序右子树
inorder(node.right);
}
}在树上进行中序遍历,但会将树中的节点之间重新连接而不使用额外的空间。具体地,当我们遍历到一个节点时,把它的左孩子设为空,并将其本身作为上一个遍历到的节点的右孩子。
import java.util.*;
public class Solution {
//指向当前节点,类似与指针的东西
TreeNode cur;
public TreeNode increasingBST(TreeNode root) {
//创建空树
TreeNode ans = new TreeNode(0);
//当前节点就是null,java中对象的赋值是同一个
cur = ans;
//从根节点开始遍历改变树的结构
inorder(root);
//返回新树的右子树
return ans.right;
}
//遍历改变树结构
public void inorder(TreeNode node) {
//树已为空,返回
if (node == null)
return;
//遍历左子树
inorder(node.left);
//当前节点左子树置空,随着遍历改变
//不能为cur,不然会将得到该节点上面的节点全部删除
node.left = null;
//当前节点右子树即为遍历节点
cur.right = node;
//当前节点转换为正在遍历的节点
cur = node;
//遍历右子树
inorder(node.right);
}
}
















