题目地址:
https://www.lintcode.com/problem/convert-binary-tree-to-doubly-linked-list/description
给定一个二叉树,要求按其中序遍历转为一个双向链表。最后返回链表头节点。
思路是分治。如果是空树则返回null,否则先convert左右子树,然后new出中间节点。先把右边部分接到中间节点上,接着判断左半边是否为null,如果是,则root对应的节点就是要返回的头结点;否则找到左半边的表尾,连到root的节点上,再返回左链表的头即可。代码如下:
public class Solution {
/**
* @param root: The root of tree
* @return: the head of doubly list node
*/
public DoublyListNode bstToDoublyList(TreeNode root) {
// write your code here
if (root == null) {
return null;
}
DoublyListNode mid = new DoublyListNode(root.val);
DoublyListNode leftHead = bstToDoublyList(root.left), rightHead = bstToDoublyList(root.right);
mid.next = rightHead;
if (rightHead != null) {
rightHead.prev = mid;
}
if (leftHead == null) {
return mid;
}
DoublyListNode cur = leftHead;
while (cur.next != null) {
cur = cur.next;
}
cur.next = mid;
mid.prev = cur;
return leftHead;
}
}
class TreeNode {
int val;
TreeNode left, right;
public TreeNode(int val) {
this.val = val;
}
}
class DoublyListNode {
int val;
DoublyListNode next, prev;
public DoublyListNode(int val) {
this.val = val;
}
}
时间复杂度 O ( n 2 ) O(n^2) O(n2),主要是左链表找表尾需要些时间,空间 O ( h ) O(h) O(h)。