This is a "In Order" traversal problem, because the order of the result is a in order or the tree.

1. The problem need to return the pointer to the smallest element of the linked list, so we first need to find the smallest element.

2. The problem requires "We want to do the transformation in place", that mean we should not create a new link.

3. We need a "pre-node" to indicate the last node that was just traversed before the current node.

The solution is as following, time complexity is O(n):

    private Node pre = new Node();  //3. pre-node
    public Node treeToDoublyList(Node root) {
        if(root==null)
            return null;
        Node head = root;
        while(head.left!=null){
            head = head.left;   //1. find the smallest element
        }
        inOrder(root);
        pre.right = head;
        head.left = pre;
        return head;
    }
    
    private void inOrder(Node root){ //2. in place
        if(root == null)
            return;
        inOrder(root.left);
        pre.right = root;
        root.left = pre;
        pre = root;
        inOrder(root.right);
    }

 

posted on 2022-02-05 02:33  阳光明媚的菲越  阅读(22)  评论(0编辑  收藏  举报