LeetCode 426. 将二叉搜索树转化为排序的双向链表
将一个二叉搜索树就地转化为一个已排序的双向循环链表。可以将左右孩子指针作为双向循环链表的前驱和后继指针。
为了让您更好地理解问题,以下面的二叉搜索树为例:
我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
下图展示了上面的二叉搜索树转化成的链表。“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. 将二叉搜索树转化为排序的双向链表相关推荐
- LeetCode 426. 将二叉搜索树转化为排序的双向链表(BST中序循环遍历)
文章目录 1. 题目 2. 解题 1. 题目 将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 . 对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最 ...
- leetcode题解538-把二叉搜索树转化为累加树
问题描述 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和. 解题思路 要找到比某个 ...
- LeetCode -538 把二叉搜索树转化为累加树(C语言描述)
题目描述: 题目来源: https://leetcode-cn.com/problems/convert-bst-to-greater-tree/ 思路: 采用递归反序中序遍历实现,因为二叉搜索树右节 ...
- 讲二次搜索树转化为排序的双向链表
package com.gylhaut.bean;public class TreeNode<T> {public T data;public TreeNode left;public T ...
- [二叉树遍历|BST]leetcode 538 把二叉搜索树转换为累加树
[二叉树遍历|BST]leetcode 538 把二叉搜索树转换为累加树 1.题目 题目链接 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree) ...
- Leetcode 538. 把二叉搜索树转换为累加树 C++
Leetcode 538. 把二叉搜索树转换为累加树 题目 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加 ...
- Leetcode 98:验证二叉搜索树
Leetcode 98:验证二叉搜索树 题目描述 我的解法:非递归的中序遍历 其它解法1:非递归的中序遍历,用LONG_MIN规避树的val等于INT_MIN的情况 其他解法2:递归的中序遍历思想 其 ...
- LeetCode实战:二叉搜索树的最近公共祖先
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Given a bin ...
- LeetCode 1382. 将二叉搜索树变平衡(中序遍历+二分递归)
1. 题目 给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值. 如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1 ,我们就称这棵二叉搜索树是 平 ...
最新文章
- boost::log模块实现格式化程序流的测试程序
- mockito接口没法赋值_Mockito:无法实例化@InjectMocks字段:类型是接口
- mysql查找最大值最小值_查找两个8位数字的最大值| 8086微处理器
- matlab对文本文件的读写
- sql取日期的年月_机油检测美版银美孚5W30,生产日期20年1月
- Git撤销修改、回退版本相关命令
- 超市管理系统连接服务器失败,国内超市管理系统的使用现状
- 面试官:如何进行 JVM 调优(附真实案例)
- 笔记之_Java整理IO流
- 定时下载快速精密星历
- sql 语句,主键外键详解
- pcie读写ddr_DDR4内存与PCIe 双杀打造4秒闪开的五星神机
- Hacker News API
- freeotp使用教程_软件使用教程
- 那些以玩笑说出口的话,往往是最真的表达
- manjaro i3wm社区版配置记录
- 第十七届全国大学生智能车竞赛山东赛区比赛成绩
- 计算机程序设计基础试题,2010计算机程序设计基础试题A2卷(考试时间:2010-7-1)new...
- http://www.prayer-laputa.com/blog/archives/588
- 【Selenium Grid 分布式测试】Selenium Grid-简介
热门文章
- HDU2022 海选女主角
- Linux实用命令大合集(长期更新)
- 面试准备工作 -戈多编程
- Android webservice的用法详细讲解
- JavaScript 之 特殊运算符
- jeasyui控件事件和方法的使用方法
- java.lang.IllegalArgumentException: Path index does not start with a / character
- PetShop之表示层设计(转载)
- Project 2007如何打开项目向导
- 【积累】C/C++中明明该用函数实现的功能,为啥非要自己写代码