leetcode
leetcode 2951 ~ 3000
递增顺序搜索树

递增顺序搜索树

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 23 ms, 内存: 16.0 MB


/*
 * 题目思路:
 * 1. 使用Java Stream的API和Lambda表达式,对二叉搜索树进行中序遍历。
 * 2. 将结果转换为一个只有右子节点的链表。
 */
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Solution {
    public TreeNode increasingBST(TreeNode root) {
        List<Integer> values = new ArrayList<>();
        inorderTraversal(root, values);
        TreeNode dummy = new TreeNode(0); // 虚拟根节点
        TreeNode current = dummy;
        for (int val : values) {
            current.right = new TreeNode(val); // 生成新节点
            current = current.right; // 移动到下一个节点
        }
        return dummy.right;
    }

    private void inorderTraversal(TreeNode node, List<Integer> values) {
        if (node == null) return;
        inorderTraversal(node.left, values); // 递归遍历左子树
        values.add(node.val); // 添加节点值
        inorderTraversal(node.right, values); // 递归遍历右子树
    }
}

解释

方法:

此题解采用了中序遍历的方式来遍历二叉搜索树。首先,通过递归的方式对树进行中序遍历,并将遍历的结果存储在一个数组中。然后,使用这个数组来构建一个新的递增顺序搜索树,这个新树的每个节点都只有右子节点,没有左子节点。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
在中序遍历时,如何确保所有节点都被正确访问,并且按照左-根-右的顺序输出?
在中序遍历中,递归地访问二叉树的左子树,然后处理当前节点(通常是进行一些操作如打印或存储节点值),最后递归地访问右子树。这种方式确保了所有节点都按照左-根-右的顺序被访问。递归的基本案例是检查当前节点是否为空,如果为空,则返回,不进行任何操作。这保证了只有存在的、非空的节点才被处理,从而确保所有节点都被正确且完整地访问。
🦆
递归函数中使用了nonlocal关键字来访问外部变量res,这种做法有什么优缺点?
使用`nonlocal`关键字允许内嵌函数修改封闭作用域中的变量。优点包括:1) 可以直接在内部函数中修改外部变量,使代码更简洁;2) 避免使用全局变量,减少了变量作用域的污染。缺点包括:1) 过度依赖`nonlocal`可能会使得函数的行为变得不那么明显,降低代码的可读性;2) 在复杂的函数嵌套中,修改外部变量可能导致错误难以追踪和调试。
🦆
新的递增顺序搜索树中节点只有右子节点,这种结构对搜索效率有何影响?
新的递增顺序搜索树实质上是一种只有右子节点的链表结构。这种结构的搜索效率不如传统的二叉搜索树。在传统的二叉搜索树中,每个节点的左右子节点分别小于和大于该节点,这样可以在每个节点处根据搜索值选择向左或向右,有效地减半搜索路径的长度。然而,在只有右子节点的树中,搜索任何值都需要从头到尾遍历整个链表,因此搜索效率为线性时间O(n),而不是二叉搜索树的对数时间O(log n)。

相关问题