递归做法:
* 将左子树转成一个左双向链表,并返回该链表的第一个节点(最左边的节点)
* 定位到左链表的最后一个节点(即左子树的最右节点)
* 如果左链表非空,将根的left指向左子树的最右节点,最右节点的right指向root
* 将右子树转成一个右双向链表,并返回链表的第一个节点
* 如果右链表非空,将root的right指向右链表的第一个节点,第一个节点的left指向root
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null){
return null;
}
if(pRootOfTree.left==null && pRootOfTree.right==null){
return pRootOfTree;
}
TreeNode left=Convert(pRootOfTree.left); //将左子树转成一个左双向链表,且left指向的是左子树的最左节点
//下面去找左子树的最右节点
TreeNode p=left;
while(p!=null && p.right!=null){
p=p.right;
}
if(left!=null){
pRootOfTree.left=p;
p.right=pRootOfTree;
}
TreeNode right=Convert(pRootOfTree.right); //将右子树转成右双向链表
if(right!=null){
right.left=pRootOfTree;
pRootOfTree.right=right;
}
return left!=null?left:pRootOfTree;
}