面试题27. 二叉搜索树与双向链表
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:
由于是BST树,我们可以中序遍历树中的节点,这样的到的结果才能是排好序的。在中序遍历的过程中,把左子树和右子树作为一个整体分别处理。左子树转为双向链表的结果是【4、6、8】,这个链表的结尾是8,把8和10连在一起。然后转换右子树,右子树转换的结果是【12、14、16】,这个链表的头结点是12,把10和12连在一起。
java 代码如下:
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null) return null;
TreeNode leftHead = Convert(pRootOfTree.left);
if (leftHead != null) {
TreeNode head = leftHead;
while (head.right != null) head = head.right;
head.right = pRootOfTree;
pRootOfTree.left = head;
}
TreeNode rightHead = Convert(pRootOfTree.right);
if (rightHead != null) {
pRootOfTree.right = rightHead;
rightHead.left = pRootOfTree;
}
return leftHead != null ? leftHead : pRootOfTree;
}
}