一、题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
题目详情见链接二叉搜索树与双向链表
二、解题思路
本题可以采用分治的思想来解决,即先把左子树转为双向链表,然后把根结点转为双向链表,最后把右子树转为双向链表,递归进行。
由二叉搜索树的性质可知,二叉搜索树的中序遍历结果是一个有序的数组,因此可以借助二叉搜索树的中序遍历来把二叉搜索树转换为有序的双向循环链表。由于是双向链表,需要外部定义一个节点来存储递归返回时节点的引用。代码如下:
/*
// 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;
Node last=null;
public Node treeToDoublyList(Node root) {
if(root==null) {
return root;
}
helper(root);
head.left=last;
last.right=head;
return head;
}
private void helper(Node node){
if(node!=null){
helper(node.left);
if(head==null){
head=node;
}else{
last.right=node;
node.left=last;
}
last=node;
helper(node.right);
}
}
}