描述:
将一个二叉查找树按照中序遍历转换成双向链表。
样例:
给定一个二叉查找树:
4
/ \
2 5
/ \
1 3
返回 1<->2<->3<->4<->5
。
Java代码:
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
* Definition for Doubly-ListNode.
* public class DoublyListNode {
* int val;
* DoublyListNode next, prev;
* DoublyListNode(int val) {
* this.val = val;
* this.next = this.prev = null;
* }
* }
*/
public class Solution {
/**
* @param root: The root of tree
* @return: the head of doubly list node
*/
public DoublyListNode bstToDoublyList(TreeNode root) {
if(root==null){
return null;
}
DoublyListNode rootNode = travelTree(root);
while(rootNode.prev!=null){
rootNode=rootNode.prev;
}
return rootNode;
}
public DoublyListNode travelTree(TreeNode root) {
if(root==null){
return null;
}
DoublyListNode rootNode = new DoublyListNode(root.val);
if(root.left != null){
DoublyListNode leftNode = travelTree(root.left);
//寻找左子树的最右节点
while(leftNode.next != null){
leftNode = leftNode.next;
}
leftNode.next = rootNode;
rootNode.prev = leftNode;
}
if(root.right != null){
DoublyListNode rightNode = travelTree(root.right);
//寻找右子树的最左节点
while(rightNode.prev!=null){
rightNode = rightNode.prev;
}
rightNode.prev = rootNode;
rootNode.next = rightNode;
}
//总是返回根节点
return rootNode;
}
}