题目链接:
解题思路:
我自己想出来的方法是:先用中序遍历将所有节点读到数组里,然后遍历数组形成双向链表
网上博客用的方法:使用递归一次成型——在递归中,以根节点为单位,不断拼接前后指针,最后返回树最左边儿的节点(这种方法很巧妙,递归看起来很清爽)
下面是源代码
1.(用缓存实现)
public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree==null)return null; ArrayList<TreeNode> res_temp = new ArrayList<>(); inOrder(pRootOfTree,res_temp); TreeNode[] res = {}; res = res_temp.toArray(res); for(int i = 1;i<res.length;++i){ res[i].left = res[i-1]; res[i-1].right = res[i]; } return res[0]; } private void inOrder(TreeNode root,ArrayList<TreeNode> res_temp){ if(root==null) return; inOrder(root.left,res_temp); res_temp.add(root); inOrder(root.right,res_temp); }
2.(使用递归)
//递归一遍成表 public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree==null)return null; if(pRootOfTree.left==null&&pRootOfTree.right==null)return pRootOfTree; TreeNode left = Convert(pRootOfTree.left);//返回的是树的最左边儿的节点 TreeNode p = left; while (p!=null&&p.right!=null){ p = p.right; } if(left!=null){ p.right = pRootOfTree; pRootOfTree.left = p; } TreeNode right = Convert(pRootOfTree.right); if(right!=null){ pRootOfTree.right = right; right.left = pRootOfTree; } return left!=null?left:pRootOfTree; }
代码已经ac
希望对大家有所帮助
以上