题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
基本思路
二叉搜索树的左右子树指针类似于双向链表的前后指针,而左子树就是都小于根节点,右子树都大于根节点。因此核心点就是找到子树转换后链表的最后一个节点然后与根节点进行对接。
基本步骤为:
- 处理左子树,获取左子树中链表的最后一个节点lastNode;
- 将lastNode连接到当前树的根节点curNode上;
- 更新链表的最后一个节点为curNode(lastNode = curNode);
- 处理右子树,获取链表的最后一个节点,赋值给lastNode;
- 返回当前树对应链表的最后一个节点。
如下图所示:
具体解答过程如下:
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null) {
return null;
}
convertToList(pRootOfTree, null);
TreeNode head = pRootOfTree;
while (head.left != null) {
head = head.left;
}
return head;
}
private TreeNode convertToList(TreeNode curNode, TreeNode lastNodeInList) {
if (curNode == null) {
return null;
}
TreeNode newLastNode = lastNodeInList;
if (curNode.left != null) {
newLastNode = convertToList(curNode.left, lastNodeInList);
}
curNode.left = newLastNode;
if (newLastNode != null) {
newLastNode.right = curNode;
}
newLastNode = curNode;
if (curNode.right != null) {
newLastNode = convertToList(curNode.right, newLastNode);
}
return newLastNode;
}