基本思路
利用递归进行二叉搜索树的中序遍历,先将左子树转换成双向链表,将左子树链表的最后一个节点与根节点双向连接好后,再将右子树递归进行转换,将右子树转换后的第一个节点与根节点连接,最后根据左子树是否为空决定返回左子树第一个节点或返回根节点即可。遍历过程中用一个变量last记录左子树的最后一个节点,以免每次在连接左子树与根节点时都需要重新定位左子树链表的最后一个节点。
AC代码(Java)
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
private static TreeNode last=null;
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null){
return null;
}
if(pRootOfTree.left==null && pRootOfTree.right==null){
last=pRootOfTree;
return pRootOfTree;
}
//将左子树转换成双向链表
TreeNode left=Convert(pRootOfTree.left);
if(left!=null){
last.right=pRootOfTree;
pRootOfTree.left=last;
}
last=pRootOfTree;
TreeNode right=Convert(pRootOfTree.right);
if(right!=null){
right.left=pRootOfTree;
pRootOfTree.right=right;
}
return left!=null ? left : pRootOfTree;
}
}