第 15 日:二叉搜索树与双向链表
题目链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/
题目
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
为了让您更好地理解问题,以下面的二叉搜索树为例:
解题
-
中序遍历二叉树
解题思路:
有一个重要的性质就是:二叉搜索树的中序遍历是一个递增数列。
1.也就是说我们在中序遍历的同时,记录上一个结点,并且将结点的right指向自己,将自己的left指向上一个结点
2.接下来发现首尾部也是要双向连接的,所以我们同时还要保存首部结点,最后中序遍历完,是首尾双向连接
3.根据上述两点,最终要的就是保存新的头结点和保存上一个结点!详细代码如下:
/*
// Definition for a Node.
class Node {
public int val;
public Node left;
public Node right;
public Node() {}
public Node(int _val) {
val = _val;
}
public Node(int _val,Node _left,Node _right) {
val = _val;
left = _left;
right = _right;
}
};
*/
class Solution {
Node head=null,pre=null;
public Node treeToDoublyList(Node root) {
if(root==null) return null;
dfs(root);
head.left=pre;
pre.right=head;
return head;
}
public void dfs(Node node){
if(node==null) return;
dfs(node.left);
if(head==null) head=node;
if(pre!=null){
pre.right=node;
}
node.left=pre;
pre=node;
dfs(node.right);
}
}