将一个二叉搜索树就地转化为一个已排序的双向循环链表。可以将左右孩子指针作为双向循环链表的前驱和后继指针。

为了让您更好地理解问题,以下面的二叉搜索树为例:

我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。

下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。

特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。

下图显示了转化后的二叉搜索树,实线表示后继关系,虚线表示前驱关系。

算法:我们知道,返回的双向链表是排好序的,所以我们需要利用BST的中序遍历。我们先递归整个左子树,再递归整个右子树。需要注意的是,左子树最右边的结点的后继结点就是根结点,而右子树最左边的结点的前驱结点是根节点。为了对应这种关系,我们利用pair进行结点的存储。最后不要忘了做循环处理即可。

/*
// Definition for a Node.
class Node {
public:int val;Node* left;Node* right;Node() {}Node(int _val, Node* _left, Node* _right) {val = _val;left = _left;right = _right;}
};
*/
class Solution {
public:pair<Node*, Node*>dfs(Node* root){if(!root->left&&!root->right)return {root,root};if(root->left&&root->right){auto ls=dfs(root->left), rs=dfs(root->right);ls.second->right=root,root->left=ls.second;rs.first->left=root,root->right=rs.first;return {ls.first, rs.second};}if(root->left){auto ls=dfs(root->left);ls.second->right=root,root->left=ls.second;return {ls.first, root};}if(root->right){auto rs=dfs(root->right);rs.first->left=root,root->right=rs.first;return {root, rs.second};}return {root,root};}Node* treeToDoublyList(Node* root) {if(!root)return NULL;auto side=dfs(root);side.first->left=side.second;side.second->right=side.first;return side.first;}
};

转载于:https://www.cnblogs.com/programyang/p/11161866.html

LeetCode 426. 将二叉搜索树转化为排序的双向链表相关推荐

  1. LeetCode 426. 将二叉搜索树转化为排序的双向链表(BST中序循环遍历)

    文章目录 1. 题目 2. 解题 1. 题目 将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 . 对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最 ...

  2. leetcode题解538-把二叉搜索树转化为累加树

    问题描述 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和. 解题思路 要找到比某个 ...

  3. LeetCode -538 把二叉搜索树转化为累加树(C语言描述)

    题目描述: 题目来源: https://leetcode-cn.com/problems/convert-bst-to-greater-tree/ 思路: 采用递归反序中序遍历实现,因为二叉搜索树右节 ...

  4. 讲二次搜索树转化为排序的双向链表

    package com.gylhaut.bean;public class TreeNode<T> {public T data;public TreeNode left;public T ...

  5. [二叉树遍历|BST]leetcode 538 把二叉搜索树转换为累加树

    [二叉树遍历|BST]leetcode 538 把二叉搜索树转换为累加树 1.题目 题目链接 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree) ...

  6. Leetcode 538. 把二叉搜索树转换为累加树 C++

    Leetcode 538. 把二叉搜索树转换为累加树 题目 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加 ...

  7. Leetcode 98:验证二叉搜索树

    Leetcode 98:验证二叉搜索树 题目描述 我的解法:非递归的中序遍历 其它解法1:非递归的中序遍历,用LONG_MIN规避树的val等于INT_MIN的情况 其他解法2:递归的中序遍历思想 其 ...

  8. LeetCode实战:二叉搜索树的最近公共祖先

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Given a bin ...

  9. LeetCode 1382. 将二叉搜索树变平衡(中序遍历+二分递归)

    1. 题目 给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值. 如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1 ,我们就称这棵二叉搜索树是 平 ...

最新文章

  1. boost::log模块实现格式化程序流的测试程序
  2. mockito接口没法赋值_Mockito:无法实例化@InjectMocks字段:类型是接口
  3. mysql查找最大值最小值_查找两个8位数字的最大值| 8086微处理器
  4. matlab对文本文件的读写
  5. sql取日期的年月_机油检测美版银美孚5W30,生产日期20年1月
  6. Git撤销修改、回退版本相关命令
  7. 超市管理系统连接服务器失败,国内超市管理系统的使用现状
  8. 面试官:如何进行 JVM 调优(附真实案例)
  9. 笔记之_Java整理IO流
  10. 定时下载快速精密星历
  11. sql 语句,主键外键详解
  12. pcie读写ddr_DDR4内存与PCIe 双杀打造4秒闪开的五星神机
  13. Hacker News API
  14. freeotp使用教程_软件使用教程
  15. 那些以玩笑说出口的话,往往是最真的表达
  16. manjaro i3wm社区版配置记录
  17. 第十七届全国大学生智能车竞赛山东赛区比赛成绩
  18. 计算机程序设计基础试题,2010计算机程序设计基础试题A2卷(考试时间:2010-7-1)new...
  19. http://www.prayer-laputa.com/blog/archives/588
  20. 【Selenium Grid 分布式测试】Selenium Grid-简介

热门文章

  1. HDU2022 海选女主角
  2. Linux实用命令大合集(长期更新)
  3. 面试准备工作 -戈多编程
  4. Android webservice的用法详细讲解
  5. JavaScript 之 特殊运算符
  6. jeasyui控件事件和方法的使用方法
  7. java.lang.IllegalArgumentException: Path index does not start with a / character
  8. PetShop之表示层设计(转载)
  9. Project 2007如何打开项目向导
  10. 【积累】C/C++中明明该用函数实现的功能,为啥非要自己写代码