首页 > 其他分享 >剑指 Offer 36. 二叉搜索树与双向链表

剑指 Offer 36. 二叉搜索树与双向链表

时间:2023-04-08 23:44:43浏览次数:39  
标签:Node right cur temp Offer 36 链表 root left

题目链接:剑指 Offer 36. 二叉搜索树与双向链表

方法一:回溯

解题思路

image.png

代码

class Solution {
private:
    int mx = INT_MIN, mi = INT_MAX;
    Node* start = NULL, * end = NULL;
public:
    void Lrotate(Node* root, Node* last_root) { // 针对左子树,左旋
        if (!root || !root->right) return ;
        Node* temp = root->right;
        while (temp->right) temp = temp->right; // 找当前子树的最大值节点
        last_root->left = temp;
        temp->right = last_root;
    }
    void Rrotate(Node* root, Node* last_root) { // 针对右子树,右旋
        if (!root || !root->left) return ;
        Node* temp = root->left;
        while (temp->left) temp = temp->left; // 找当前子树的最小值节点
        last_root->right = temp;
        temp->left = last_root;
    }
    void dfs(Node* root) { // 回溯,先递归到底层,然后在回溯的过程中转换为双向链表
        if (!root) return ;
        if (root->val < mi) {
            mi = root->val;
            start = root;
        }
        if (root->val > mx) {
            mx = root->val;
            end = root;
        }
        dfs(root->left);
        dfs(root->right);
        Lrotate(root->left, root);
        Rrotate(root->right, root);
        if (root->left) root->left->right = root;
        if (root->right) root->right->left = root;
    }
    Node* treeToDoublyList(Node* root) {
        dfs(root);
        if (!start) return NULL;
        start->left = end;
        end->right = start;
        return start;
    }
};

复杂度分析

时间复杂度:\(O(n)\);
空间复杂度:\(O(n)\),递归调用栈空间。

方法二:中序遍历

代码

class Solution {
private:
    Node* pre = NULL, * head = NULL; // 通过一个前指针实现转换过程
public:
    void dfs(Node* cur) {
        if (!cur) return ;
        dfs(cur->left);
        if (pre != NULL) pre->right = cur; 
        else head = cur; // 找到最左边节点
        cur->left = pre;
        pre = cur;
        dfs(cur->right);
    }
    Node* treeToDoublyList(Node* root) {
        if (!root) return NULL;
        dfs(root);
        head->left = pre; // 此时的pre指向最后一个节点
        pre->right = head;
        return head;
    }
};

标签:Node,right,cur,temp,Offer,36,链表,root,left
From: https://www.cnblogs.com/lxycoding/p/17299591.html

相关文章

  • 剑指 Offer 37. 序列化二叉树
    题目链接:剑指Offer37.序列化二叉树取巧做法classCodec{private:TreeNode*root;public://Encodesatreetoasinglestring.stringserialize(TreeNode*root){this->root=root;return"";}//Decodesyourencoded......
  • 剑指 Offer 33. 二叉搜索树的后序遍历序列
    题目链接:剑指Offer33.二叉搜索树的后序遍历序列方法:分治解题思路首先假设该序列能够构成某个二叉搜索树的后序遍历序列,那么这个序列会被分成3个部分:左子树序列,右子树序列,父节点,其中左右子树节点数可能为0;现在就可以检查该序列是否符合这个规律,然后递归的判断子树是否符合......
  • 剑指 Offer 20. 表示数值的字符串
    题目链接:剑指Offer20.表示数值的字符串方法:模拟解题思路根据题意模拟,详情见代码注释。代码classSolution{public:boolisDecimal(strings){intfirst_symbol=s.find_first_of('.');//第一个'.'的位置intlast_symbol=s.find_last_of('.'......
  • PAT Basic 1075. 链表元素分类
    PATBasic1075.链表元素分类1.题目描述:给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而[0,K]区间内的元素都排在大于K的元素前面。但每一类内部元素的顺序是不能改变的。例如:给定链表为18→7→-4→0→5→-6→10→11→-2,K为......
  • 2363. 合并相似的物品
    题目链接:2363.合并相似的物品方法一:归并解题思路先对两个整数数组进行\(sort\)排序,然后对两个数组进行归并操作。代码classSolution{public:vector<vector<int>>mergeSimilarItems(vector<vector<int>>&items1,vector<vector<int>>&items2){sort......
  • 剑指 Offer 19. 正则表达式匹配
    题目链接:剑指Offer19.正则表达式匹配方法:动态规划解题思路详情见:逐行详细讲解,由浅入深,dp和递归两种思路代码classSolution{public:boolisMatch(strings,stringp){intn=s.size(),m=p.size();boolf[n+1][m+1];//f[i][j]代表s......
  • 36.配置
    一.基本参数1.定义:在同一零件下通过配置可生成多个特征,典型的是标准件库;二.实际操作方式一.1,点击配置,先重命名现有的零件配置  ......
  • poj-3367(线段树+区间合并)
    HotelPOJ-3667思路:与hdu-1540(线段树+区间合并)-魏老6-博客园(cnblogs.com)类似,只不过是区间修改,多维护一个最大连续区间sum。#define_CRT_SECURE_NO_WARNINGS1#include<algorithm>#include<fstream>#include<iostream>#include<cstdio>#include<deque>#includ......
  • Leetcode(剑指offer专项训练)——DFS/BFS专项(1)
    计算除法题目给定一个变量对数组equations和一个实数值数组values作为已知条件,其中equations[i]=[Ai,Bi]和values[i]共同表示等式Ai/Bi=values[i]。每个Ai或Bi是一个表示单个变量的字符串。另有一些以数组queries表示的问题,其中queries[j]=[Cj,Dj]......
  • 链表中的节点每k个一组翻转
    classSolution{publicListNodereverseKGroup(ListNodehead,intk){ListNodedummy=newListNode(0);//定义虚拟节点dummy.next=head;ListNodeprev=dummy;//定义一个前置节点prev,用于保存已经翻转完成的部分的尾部节点......