题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解答:
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null)return null;
if(pRootOfTree.left==null&&pRootOfTree.right==null){
return pRootOfTree;
}else if(pRootOfTree.left==null&&pRootOfTree.right!=null){
pRootOfTree.right=Convert(pRootOfTree.right);
pRootOfTree.right.left=pRootOfTree;
return pRootOfTree;
}else if(pRootOfTree.left!=null&&pRootOfTree.right==null){
TreeNode head=null;
TreeNode tail= Convert(pRootOfTree.left);
head=tail;
while(tail.right!=null){
tail=tail.right;
}
pRootOfTree.left=tail;
pRootOfTree.left.right=pRootOfTree;
return head;
}else{
TreeNode head=null;
TreeNode tail= Convert(pRootOfTree.left);
head=tail;
while(tail.right!=null){
tail=tail.right;
}
pRootOfTree.left=tail;
pRootOfTree.left.right=pRootOfTree;
pRootOfTree.right=Convert(pRootOfTree.right);
pRootOfTree.right.left=pRootOfTree;
return head;
}
}
}
思路:
使用递归的解法:把函数理解为输入一个二叉树的根,返回一个双向链表的头结点,以左孩子构成的双向链表的尾节点作为根节点左侧相邻的节点,以右孩子构成的双向链表的头节点作为根节点右侧相邻的节点。递归拼接成一条双向链表,并返回双向链表的头结点。
重点:
重点是递归时注意左右子树为空时候的判断!