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

题目:

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

 

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

 

 

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

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

 

 

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

代码:

复制代码
 1 /*
 2 // Definition for a Node.
 3 class Node {
 4     public int val;
 5     public Node left;
 6     public Node right;
 7 
 8     public Node() {}
 9 
10     public Node(int _val) {
11         val = _val;
12     }
13 
14     public Node(int _val,Node _left,Node _right) {
15         val = _val;
16         left = _left;
17         right = _right;
18     }
19 };
20 */
21 class Solution {
22     static List<Node> list=new ArrayList<>();
23     public Node treeToDoublyList(Node root) {
24         if(root==null){return null;}
25 
26         list.clear(); //因为力扣静态变量需要每次初始化,不然上一次用例会被保存
27 
28        
29         midOrder(root);
30 
31         Iterator<Node> iterator=list.iterator();
32         Node head=iterator.next();
33         Node pre=head;
34         Node p=head;
35         //设置左右指针
36         while(iterator.hasNext()){
37             p=iterator.next();
38             pre.right=p;
39             p.left=pre;
40             pre=p;
41         }
42         p.right=head;
43         head.left=p;
44         return head;
45     }
46 //中序遍历得到节点是递增,那么依次放入动态数组中,可以快速设置left和right指针
47     public static void  midOrder(Node root){
48         if(root!=null){
49             if(root.left!=null){
50                 midOrder(root.left);
51             }
52             list.add(root);
53             if(root.right!=null){
54                 midOrder(root.right);
55             }
56         }
57     }
58 
59 }
复制代码

 

posted @   堤苏白  阅读(40)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示