Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >每天一道剑指offer-二叉搜索树与双向链表

每天一道剑指offer-二叉搜索树与双向链表

作者头像
乔戈里
发布于 2019-09-17 08:04:39
发布于 2019-09-17 08:04:39
29200
代码可运行
举报
文章被收录于专栏:Java那些事Java那些事
运行总次数:0
代码可运行

昨天的题解

题目

每天一道剑指offer-二叉搜索树与双向链表 来源: https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题目详述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

题目详解

思路

  • 先中序遍历二叉搜索树,这样二叉搜索树就按照val值的大小从小到大排好序了,存放在数组中
  • 然后要转换为双向链表,由于数组中的存放的树的节点已经按照键值从小到大排好序了,那么就对于每个节点的左子树指向数组的上一个节点,右子树指向数组的下一个节点,这样就完成了变成双向链表。

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Solution {
    public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree == null || (pRootOfTree.left == null && pRootOfTree.right == null))
            return pRootOfTree;
        ArrayList<TreeNode> nodeList = new ArrayList<>();
        BuildArrayList(pRootOfTree,nodeList);//这个函数执行后,数组中每个元素按照大小前后排序
        for(int i=0;i<nodeList.size();i++)
        {
            if(i == 0)
            {//数组的第一个节点处理,只有右子树指向下一个节点
                nodeList.get(0).right = nodeList.get(1);
            }
            else if(i == nodeList.size()-1)
            {//数组的最后一个节点,只有左子树指向前一个节点
                nodeList.get(i).left = nodeList.get(i-1);
            }
            else{//数组中的中间节点,左子树指向上一个节点,右子树指向数组的下一个节点
                nodeList.get(i).left = nodeList.get(i-1);
                nodeList.get(i).right = nodeList.get(i+1);
            }
        }
        return nodeList.get(0);
    }
    public void BuildArrayList(TreeNode root,ArrayList<TreeNode> nodeList)
    {//二叉搜索的中序遍历,并把每个节点存入数组中
        if(root == null)
            return;
        if(root.left != null)//左子树
            BuildArrayList(root.left,nodeList);
        if(root != null)//根节点
            nodeList.add(root);
        if(root.right != null)//右子树
            BuildArrayList(root.right,nodeList);
    }
}

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员乔戈里 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Leetcode】98. 验证二叉搜索树
这道题目主要是利用二叉搜索树的一个性质: 二叉搜索树的中序遍历结果是一个升序的序列。 那么问题转变成:中序遍历 + 验证是不是升序.
Leetcode名企之路
2019/04/25
3690
剑指offer No.26 二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
week
2022/11/26
2900
剑指Offer-二叉搜索树与双向链表
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 思路 思路一: 由于要求链表是有序的,可以借助二叉树中序遍历,因为中序遍历算法的特点就是从小到大访问结点。中序遍历过程中,根节点不断加到右边,这样可以保持从左到右升序。 由于中序遍历过程正好是转换成链表的过程,即可采用递归处理。 代码实现 package Tree; /** * 二叉搜索树与双向链表 * 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任
武培轩
2018/04/18
6480
剑指offer——二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
AI那点小事
2020/04/20
3490
二叉搜索树转化成双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
砖业洋__
2023/05/06
1620
二叉搜索树转化成双向链表
剑指offer | 面试题29:二叉搜索树转换为双向链表
我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。 下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。
千羽
2021/12/29
4700
剑指offer | 面试题29:二叉搜索树转换为双向链表
剑指offer 二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
week
2019/03/08
5560
[剑指offer] 二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
尾尾部落
2018/09/04
6130
[剑指offer] 二叉搜索树与双向链表
二叉搜索树与双向链表
有一颗二叉搜索树,在不创建任何新节点的条件下,如何将它转换成一个排序的双向链表?本文就跟大家分享下这个算法,欢迎各位感兴趣的开发者阅读本文。
神奇的程序员
2023/01/09
3260
二叉搜索树与双向链表
二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
五分钟学算法
2022/01/05
6750
二叉搜索树与双向链表
二叉搜索树转双向链表
思路: 明确Convert函数的功能。 输入:输入一个二叉搜索树的根节点。 过程:将其转化为一个有序的双向链表。 输出:返回该链表的头节点。 明确成员变量pLast的功能。 pLast用于记录当前链表的末尾节点。 明确递归过程。 递归的过程就相当于按照中序遍历,将整个树分解成了无数的小树,然后将他们分别转化成了一小段一小段的双向链表。再利用pLast记录总的链表的末尾,然后将这些小段链表一个接一个地加到末尾。 /** * 已排链表的最后一个结点 */ priva
名字是乱打的
2022/12/13
3050
二叉搜索树转双向链表
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
小雨的分享社区
2022/10/26
2010
剑指offer - 二叉搜索树与双向链表 - JavaScript
题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
心谭博客
2020/04/21
5880
golang刷leetcode 二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
golangLeetcode
2022/08/02
2170
golang刷leetcode  二叉搜索树与双向链表
98 验证二叉搜索树
和上题一样可以很好的想到递归的思路,左边都是越来越小,右边是越来越大。这个地方容易产生一种错觉。
木瓜煲鸡脚
2021/01/18
5010
98 验证二叉搜索树
一天一大 lee(恢复二叉搜索树)难度:困难-Day20200808
题目: 二叉搜索树中的两个节点被错误地交换。 请在不改变其结构的情况下,恢复这棵树。 示例 示例 1 输入: [1,3,null,null,2] 1 / 3 \ 2 输出:
前端小书童
2020/09/24
4750
一天一大 lee(恢复二叉搜索树)难度:困难-Day20200808
每日三题-验证二叉搜索树、二叉树的直径、把二叉搜索树转换为累加树
👨‍💻个人主页: 才疏学浅的木子 🙇‍♂️ 本人也在学习阶段如若发现问题,请告知非常感谢 🙇‍♂️ 📒 本文来自专栏: 算法 🌈 算法类型:Hot100题 🌈 ❤️ 支持我:👍点赞 🌹收藏 🤟关注 每日三题 验证二叉搜索树 二叉树的直径 把二叉搜索树转换为累加树 验证二叉搜索树 解法一 递归 每次判断cur是否在left与right之间 class Solution { public boolean isValidBST(TreeNode root) {
才疏学浅的木子
2022/11/18
2160
每日三题-验证二叉搜索树、二叉树的直径、把二叉搜索树转换为累加树
LeetCode-面试题36-二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
benym
2022/07/14
1850
LeetCode-面试题36-二叉搜索树与双向链表
Leetcode No.99 恢复二叉搜索树
给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。
week
2021/11/29
3970
☆打卡算法☆LeetCode 99、恢复二叉搜索树 算法解析
“给定二叉搜索树的根节点root,该树中有错误的节点,请在不改变结构的情况下,恢复这棵树。”
恬静的小魔龙
2022/08/07
2110
☆打卡算法☆LeetCode 99、恢复二叉搜索树  算法解析
推荐阅读
相关推荐
【Leetcode】98. 验证二叉搜索树
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验