LeetCode每日一题 897. 递增顺序搜索树

本文介绍了一种算法,用于将二叉搜索树通过中序遍历转换为递增顺序搜索树,使得最左侧节点成为根节点,每个节点仅有右子节点。提供了递归和迭代两种实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

897. 递增顺序搜索树

难度:简单
语言:Java

题目描述

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

思路解答

简单题不需要说太多思路,树的题目无外乎两种解决方法,递归与迭代。
先回顾一下树的递归三种遍历方式:

先序遍历

遍历方式为根左右

void dfs(TreeNode root) {
        if (root == null) return ;
        list.add(root); //操作流程写在这里
        dfs(root.left);
        dfs(root.right);

中序遍历

对于搜索树来说,中序遍历的是有序的,遍历方式为左根右

void dfs(TreeNode root) {
        if (root == null) return ;
        dfs(root.left);
        list.add(root); //操作流程写在这里
        dfs(root.right);

后序遍历

遍历方式为左右根

void dfs(TreeNode root) {
        if (root == null) return ;
        dfs(root.left);
        dfs(root.right);
        list.add(root); //操作流程写在这里

那回到这一题的题目,首先我们肯定是将所有的内容都找出来放进list,再进行树的构建

class Solution {
    ArrayList<TreeNode> list = new ArrayList<>();  //创建list存储中序遍历数据
    void dfs(TreeNode root){
        if (root == null) return;
        dfs(root.left);
        list.add(root);
        dfs(root.right);
    }
    public TreeNode increasingBST(TreeNode root) {
        dfs(root); //更新List
        TreeNode ans = new TreeNode(-1); 
        TreeNode cur = ans;
        for (TreeNode i : list){
            cur.right = i; 
            i.left = null;
            cur = i;
        }
        return ans.right;
    }
}

递归的方法简单明了,简单题就多看一下迭代的方法,
迭代的办法就是利用栈的特性来进行储存,就举中序遍历为例
中序遍历迭代

class Solution {
    List<TreeNode> list = new ArrayList<>();
    public TreeNode increasingBST(TreeNode root) {
        Deque<TreeNode> d = new ArrayDeque<>();
        while (root != null || !d.isEmpty()) {
            while (root != null) {
                d.add(root); //压栈
                root = root.left;
            }
            root = d.pollLast(); //出栈
            list.add(root); //储存
            root = root.right;
        }   
        TreeNode dummy = new TreeNode(-1);
        TreeNode cur = dummy;
        for (TreeNode node : list) {
            cur.right = node;
            node.left = null;
            cur = node;
        }
        return dummy.right;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值