剑指offer 36. 二叉搜索树与双向链表
题目描述
解题思路
二叉搜索树的中序遍历就是顺序链表。
本题还用到了中序遍历记录前驱的方法。
class Solution {
Node head, pre;
public Node treeToDoublyList(Node root) {
if (root == null) return null;
//将树转化为双向链表,pre最后停留在尾节点上
inorderTraversal(root);
//将 双向链表 转化为 双向循环链表
head.left = pre;
pre.right = head;
return head;
}
//中序遍历,根据以root为根节点的树和pre指针指向的前驱转化为双向链表,并且转化后,pre指针指向双向链表的尾节点
public void inorderTraversal(Node root) {
if (root == null) return;
inorderTraversal(root.left);
if (pre != null) {
pre.right = root;
} else {
head = root; //双向链表的头结点
}
root.left = pre;
pre = root; //记录前驱
inorderTraversal(root.right);
}
}