Solution 1: BST转双向链表

问题描述

将一棵二叉查找树(BST)转为有序的双向链表。

例如,有一颗BST如下:

2

|  \

1    3

转成双向链表为:

1=2=3

 

解决思路


1. 保持有序:中序遍历;

2. 双向链表:记录链表的头节点,遍历过程中记录前一个节点并且保持双向连接关系。

 

程序

class TreeNode {
	public int val;
	public TreeNode left;
	public TreeNode right;

	public TreeNode(int _val) {
		val = _val;
	}
}

class BSTToDoublyLinkedList {
	public TreeNode convertToDoublyLinkedList(TreeNode root) {
		if (root == null) {
			return null;
		}

		TreeNode head = new TreeNode(0);
		TreeNode pre = new TreeNode(0);
		convertHelper(root, head, pre);
		return head.left;
	}

	private void convertHelper(TreeNode root, TreeNode head, TreeNode pre) {
		if (root == null) {
			return;
		}
		convertHelper(root.left, head, pre);
		if (head.left == null) {
			head.left = root; // record the head
		} 
		if (pre.left == null) {
			pre.left = root;
		} else {
			pre.left.right = root;
			root.left = pre.left;
			pre.left = root; // to next
		}
		convertHelper(root.right, head, pre);
	}
}

  

附加测试程序:

public class ConvertTest {
	public static void main(String[] args) {
		TreeNode n2 = new TreeNode(3);
		n2.left = new TreeNode(1);
		n2.left.right = new TreeNode(2);

		BSTToDoublyLinkedList toDoublyLinkedList = new BSTToDoublyLinkedList();
		TreeNode head = toDoublyLinkedList.convertToDoublyLinkedList(n2);
		printDoublyLinkedList(head);
	}

	private static void printDoublyLinkedList(TreeNode head) {
		TreeNode node = head;
		TreeNode last = null;

		System.out.println("left --> right");
		while (node != null) {
			System.out.print(node.val + " ");
			if (node.right == null) {
				last = node;
			}
			node = node.right;
		}
		
		System.out.println();
		System.out.println("right --> left");

		while (last != null) {
			System.out.print(last.val + " ");
			last = last.left;
		}
	}
}

 

时间/空间复杂度

时间复杂度:中序遍历的时间复杂度,O(n);

空间复杂度:O(h),递归栈。

 

posted @ 2015-06-28 17:36  Chapter  阅读(482)  评论(0编辑  收藏  举报