牛客_剑指offer题集——二叉搜索树和双向链(java实现)

题目链接:

https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

解题思路:

我自己想出来的方法是:先用中序遍历将所有节点读到数组里,然后遍历数组形成双向链表

网上博客用的方法:使用递归一次成型——在递归中,以根节点为单位,不断拼接前后指针,最后返回树最左边儿的节点(这种方法很巧妙,递归看起来很清爽)

下面是源代码

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

希望对大家有所帮助

以上

原文地址:https://www.cnblogs.com/lavender-pansy/p/12454845.html