【Leetcode】897. Increasing Order Search Tree

本文介绍两种方法将二叉搜索树转换为单调递增的链表,第一种方法通过分治策略,先将左右子树转换为链表,再连接;第二种方法采用中序遍历,直接构建链表。第一种方法的时间复杂度为O(n^2),空间复杂度为O(h),第二种方法的时空复杂度均为O(n)。

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

题目地址:

https://leetcode.com/problems/increasing-order-search-tree/

给定一棵二叉搜索树,将其flatten成一个单调增加的链表,链表的next规定为TreeNode的right。

法1:分治。开一个函数,可以将一棵BST铺平成一个链表,并且返回链表的头尾;如果链表为空则返回两个nullptr。先分治两边,接着处理当前节点,即将左边连到当前节点,并且将当前节点连到右边。代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
 * right(right) {}
 * };
 */
class Solution {
 public:
  TreeNode* increasingBST(TreeNode* root) { return dfs(root).first; }

  pair<TreeNode*, TreeNode*> dfs(TreeNode* root) {
    if (!root) return {nullptr, nullptr};
    TreeNode *l1, *r1, *l2, *r2;
    tie(l1, r1) = dfs(root->left);
    tie(l2, r2) = dfs(root->right);
    if (r1) r1->right = root;
    root->right = l2;
    root->left = nullptr;
    return {l1 ? l1 : root, r2 ? r2 : root};
  }
};

时间复杂度 O ( n ) O(n) O(n),空间 O ( h ) O(h) O(h)

法2:直接中序遍历即可。每次append一个节点到链表末尾。代码如下:

class Solution {
 public:
  TreeNode* increasingBST(TreeNode* root) {
    TreeNode *dummy = new TreeNode(0), *cur = dummy;
    dfs(root, cur);
    return dummy->right;
  }

  void dfs(TreeNode* p, TreeNode*& cur) {
    if (!p) return;
    dfs(p->left, cur);
    cur->right = p;
    cur = p;
    cur->left = nullptr;
    dfs(p->right, cur);
  }
};

时空复杂度一样。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值