36. 二叉搜索树和双向链表
1 题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
例:
2 题目分析
由于二叉搜索树也是一种排序的数据结构,因此我们只要改变指针指向返回头结点即可。问题是如何维护双向链表的左右指向以及头结点,对于一个节点去同时维护左边和右边显得没有必要,因此我们可以对二叉树进行中序遍历每次只改变当前节点和pre节点之间的指向(即pre.right=cur,cur.left=pre),好了指针指向解决了,头结点如何找到呢,我们初始化pre=null,之后会不断更新pre的位置,那么当cur指向1的时候pre为null,故我们可知当pre为null时头结点就是cur。由于是循环链表,最后再更新head和pre之间的关联即可,思路有了代码写起来就很容易了。
3 代码
class Solution {
/*
思想:中序遍历,设置两个指针pre和cur,遍历中依次进行连接操作(即:cur.left = pre,pre.right = cur
;pre = cur),需要注意的是pre为空的时候当前节点就是头结点,遍历结束后的pre更新为最后的节点;因此中序
遍历结束后对head和pre进行连接操作(head.left = pre; pre.right = head)
*/
Node head, pre;
public Node treeToDoublyList(Node root) {
if (root == null) return null;
inOder(root);
head.left = pre;
pre.right = head;
return head;
}
private void inOder(Node root) {
if (root == null) return;
inOder(root.left);
if (pre == null) {
head = root;
} else {
pre.right = root;
}
root.left = pre;
pre = root;
inOder(root.right);
}
}