题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
参考思路
二叉搜索数特性是一个结点左子树的值都比其小(存在左子树的前提),右子树的值都比其大(存在右子树的前提)。因此要获得一个排序的双向链表,我们可以中序遍历二叉树,并在遍历的过程中更换结点的指针的指向以达到目标。其中采用一个中间结点来保存上一次访问的结点。
递归返回条件:
根结点为空时返回
参考代码
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
TreeNode lastNode = null;//默认是null,满足第一次最左边的叶结点的左结点为空
public TreeNode Convert(TreeNode pRootOfTree) {
getConvert(pRootOfTree);
//确定链表头结点
while(lastNode != null && lastNode.left != null) {
lastNode = lastNode.left;
}
return lastNode;
}
public void getConvert(TreeNode pRoot) {
if(pRoot == null) {
return ;
}
if(pRoot != null) {
getConvert(pRoot.left);
pRoot.left = lastNode;
if(lastNode != null) {
lastNode.right = pRoot;
}
lastNode = pRoot;
getConvert(pRoot.right);
}
}
}