思路
纯粹 递归的角度看,相对 会比较简单。
TreeNode[] generateLink(TreeNode p) 返回 从 p 段 为 根节点 子树 的 双向 链表的 两端。
TreeNode[0] 为 左端
TreeNode[1] 为 右端
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeNode[] generateLink(TreeNode p){
if(p == null){
return null;
}
TreeNode[] leftLink = generateLink(p.left);
TreeNode[] rightLink = generateLink(p.right);
TreeNode[] res = new TreeNode[2];
if(leftLink != null){
p.left = leftLink[1];
leftLink[1].right = p;
res[0] = leftLink[0];
}else
res[0] = p;
if(rightLink != null){
p.right = rightLink[0];
rightLink[0].left = p;
res[1] = rightLink[1];
}else
res[1] = p;
return res;
}
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree == null)
return null;
return generateLink(pRootOfTree)[0];
}
}