JZ26-二叉搜索树与双向链表

二叉搜索树与双向链表

https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tags=&title=&diffculty=0&judgeStatus=0&rp=1&tab=answerKey

class Solution {
    ArrayList<TreeNode> list = new ArrayList<>();

    public TreeNode Convert(TreeNode pRootOfTree) {
        if (pRootOfTree == null) {
            return pRootOfTree;
        }
        inOrder(pRootOfTree);
        reBuild();
        return list.get(0);
    }

    //中序遍历
    public void inOrder(TreeNode pRootOfTree) {
        Stack<TreeNode> stack = new Stack<>();
        stack.push(pRootOfTree);

        while (!stack.isEmpty()) {
            if (pRootOfTree.left != null) {
                stack.push(pRootOfTree.left);
                pRootOfTree = pRootOfTree.left;
            } else {
                TreeNode temp = stack.pop();
                list.add(temp);
                if (temp.right != null) {
                    stack.push(temp.right);
                    pRootOfTree = temp.right;
                }
            }
        }
    }

    //重建
    public void reBuild() {
        for (int i = 0; i < list.size() - 1; i++) {
            list.get(i).right = list.get(i + 1);
            list.get(i + 1).left = list.get(i);
        }
    }
}

class Solution2 {
    TreeNode pre = null;
    TreeNode root = null;

    public TreeNode Convert(TreeNode pRootOfTree) {
        if (pRootOfTree == null) {
            return null;
        }
        Convert(pRootOfTree.left);
        if (root == null) {
            root = pRootOfTree;
        }
        if (pre != null) {
            pRootOfTree.left = pre;
            pre.right = pRootOfTree;
        }
        pre = pRootOfTree;
        Convert(pRootOfTree.right);
        return root;
    }
}

class Solution3 {
    public static TreeNode convert(TreeNode root) {
        //指向双向链表的尾节点
        TreeNode lastNode = convertNode(root, null);
        //找到转换后的链表的头节点
        TreeNode pHead = lastNode;
        while (pHead != null && pHead.left != null) {
            pHead = pHead.left;
        }
        //返回链表头节点
        return pHead;
    }

    public static TreeNode convertNode(TreeNode root, TreeNode lastNode) {
        if (root == null) {
            return null;
        }
        TreeNode current = root;
        //递归处理左子树
        if (current.left != null) {
            lastNode = convertNode(current.left, lastNode);
        }

        //将当前节点的左指针指向已经转换好的链表的最后一个位置
        current.left = lastNode;
        //将已经转换好的链表的最后一个节点的右指针指向当前节点
        if (lastNode != null) {
            lastNode.right = current;
        }
        //更新已经转换好的链表的最后一个节点
        lastNode = current;

        //递归处理右子树
        if (current.right != null) {
            lastNode = convertNode(current.right, lastNode);
        }
        return lastNode;
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务