题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建新的结点,只能调整树中结点指针的指向。
比如如下图中的二叉搜索树,则输出转换之后的排序双向链表为:
由于要求转换之后的链表是排好序的,我们可以中序遍历树的每一个结点,这是因为中序遍历算法的特点是按照从小到大的顺序遍历二叉树的每一个结点。当遍历到根结点的时候,我们把树看成三部分:值为10的结点、根结点为6的左子树、根结点为14的右子树。根据排序链表的定义,值为10的结点将和它左子树最大一个结点链接起来,同时它还将和右子树的最小的结点链接起来。按照中序遍历的顺序,当我们遍历转换到根结点时,它的左子树已经转换成一个排序的链表了,并且处在链表中的最后一个结点是当前值最大的结点。接着我们去遍历转换右子树,并把根结点和右子树中最小的结点链接起来。左、右子树的转换方法相同,很自然地想到可以用递归去做。
public BinaryTreeNode convert(BinaryTreeNode root){
BinaryTreeNode node = null;
convert(root,node);
while(node != null && node.leftNode != null){
node = node.leftNode;
}
return node;
}
public void convert(BinaryTreeNode root,BinaryTreeNode lastNode){
if(root == null)
return;
BinaryTreeNode current = root;
if(current.leftNode != null)
convert(current.leftNode,lastNode);
current.leftNode = lastNode;
if(lastNode != null)
lastNode.rightNode = current;
if(current.rightNode != null)
convert(current.rightNode,lastNode);
}