剑指No.36_二叉搜索树与双向链表
-
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
-
主要思路就是利用中序遍历遍历搜索二叉树的特点(搜索的顺序是和二叉搜索树从小到大的顺序相同)来遍历每一个节点,同时改变节点的前驱和后继节点
-
参照书中的代码写的,有些小问题:
public Node treeToDoublyListWay(Node root){
Node last = null;
Node head = recur(root, last);
while (head != null && head.left != null)
head = head.left;
return head;
}
public Node recur(Node root, Node last){
if (root == null) return last;
Node current = root;
if (current.left != null)
last = recur(current.left, last);
current.left = last;
if (last != null)
last.right = current;
last = current;
if (current.right != null)
last = recur(current.right, last);
return last;
}
- 大佬的写法连接
Node pre, head;
public Node treeToDoublyListWay(Node root){
if (root == null) return null;
recur(root);
head.left = pre;
pre.right = head;
return head;
}
public void recur(Node cur){
if (cur == null) return;
recur(cur.left);
if (pre != null)
pre.right = cur;
else
head = cur;
cur.left = pre;
pre = cur;
recur(cur.right);
}