迷茫,是青春最真实的状态;但奋斗,才是青春的主基调;努力是打败焦虑的绝好方法!


897. 递增顺序搜索树

给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。

示例一:

java实现字母递增 java序号怎么递增_子树

输入: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]

示例二:

java实现字母递增 java序号怎么递增_java实现字母递增_02

输入: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);
	}
}