一、题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
二、解题思路
二叉搜索树的特点:左结点的值 < 根结点的值 < 右结点的值,所以二叉搜索树中序遍历的序列,就是排序的顺序。
根据排序双向链表的定义,根结点将和它的左子树的最大一个结点链接起来,同时它还将和它右子树最小的结点链接起来。
在中序遍历过程中,当遍历到根结点时,它的左子树已经转换成一个排序的好的双向链表,并且当前指针指向链表中最后一个的结点。将其与根结点链接起来,此时根结点就成了最后一个结点,接着遍历右子树,并把根结点和右子树中最小的结点链接起来。
例如:
[4]
[2] [6]
[1] [3] [5] [7]
排序的双向链表:{1 - 2 - 3} - 4 - {5 - 6 - 7}
三、编程实现
public class Solution {
TreeNode preNode = null;
TreeNode head = null;
public TreeNode Convert(TreeNode pRootOfTree) {
convertCore(pRootOfTree);
return head;
}
private void convertCore(TreeNode pRootOfTree) {
if (pRootOfTree == null) {
return;
}
// 递归遍历左子树
convertCore(pRootOfTree.left);
if (preNode == null) {
preNode = pRootOfTree;
head = pRootOfTree;
} else {
// 将当前结点链接到前一个结点的右边
preNode.right = pRootOfTree;
// 将前一个结点链接到当前结点的左边
pRootOfTree.left = preNode;
// 将前一个结点指向当前结点
preNode = pRootOfTree;
}
// 递归遍历右子树
convertCore(pRootOfTree.right);
}
}