Skip to main content

36 二叉搜索树与双向链表

牛客

描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示

数据范围:输入二叉树的节点数 0 \le n \le 10000≤n≤1000,二叉树中每个节点的值 0\le val \le 10000≤val≤1000
要求:空间复杂度O(1)O(1)(即在原树上操作),时间复杂度 O(n)O(n)

注意:
1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继
2.返回链表中的第一个节点的指针
3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构
4.你不用输出双向链表,程序会根据你的返回值自动打印输出

示例1

输入:{10,6,14,4,8,12,16}
返回值:From left to right are:4,6,8,10,12,14,16;From right to left are:16,14,12,10,8,6,4;

示例2

输入:{5,4,#,3,#,2,#,1}
返回值:From left to right are:1,2,3,4,5;From right to left are:5,4,3,2,1;

递归。定义一个变量 lastNode 标记上一个元素。递归完左边的元素后,左指针指向 lastNode 。返回递归前,最后一个遍历到的元素是 lastNode 。最后还要找到链表的头。

public class Solution {
TreeNode lastNode;
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null) return null;
lastNode=null;
convertNode(pRootOfTree);
while(pRootOfTree.left!=null){
pRootOfTree=pRootOfTree.left;
}
return pRootOfTree;
}

private void convertNode(TreeNode root){
if(root.left!=null) convertNode(root.left);
root.left=lastNode;
if(lastNode!=null) lastNode.right=root;
lastNode=root;
if(root.right!=null) convertNode(root.right);
}
}