题目:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:
二叉搜索树,左,根,右的大小顺序是小,中,大。从而想到中序遍历。
1.遍历根节点的左子树,形成双向链表,返回左子树链表的头;
2.若左子树不空,找到左子树链表最右边的节点,连到根节点的左边;
3.遍历根节点的右子树,若右子树不空,将右子树链表的头连在根节点的右边。
代码:
/**
public 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);
TreeNode p = lefthead;
while(p != null && p.right != null){//找到变成双链表的左子树的最右边的节点
p = p.right;
}
if (lefthead != null){//如果左子树不空,将找到的最右边的节点,放到根节点后面
p.right = pRootOfTree;
pRootOfTree.left = p;
}
//右子树
TreeNode righthead = Convert(pRootOfTree.right);
if(righthead != null){//如果右子树不空,将右子树的第一个节点,连到根节点后面
pRootOfTree.right = righthead;
righthead.left = pRootOfTree;
}
if(lefthead != null){
return lefthead;
}else{
return pRootOfTree;
}
}
}