leetcode筆記—117填充每個節點的下一個右側節點Ⅱ

題目:

給定一個二叉樹

struct TreeLinkNode {
  TreeLinkNode *left;
  TreeLinkNode *right;
  TreeLinkNode *next;
}

填充它的每個 next 指針,讓這個指針指向其下一個右側節點。如果找不到下一個右側節點,則將 next 指針設置爲 NULL

初始狀態下,所有 next 指針都被設置爲 NULL

說明:

  • 你只能使用額外常數空間
  • 使用遞歸解題也符合要求,本題中遞歸程序佔用的棧空間不算做額外的空間複雜度。

示例:

給定二叉樹,

     1
   /  \
  2    3
 / \    \
4   5    7

調用你的函數後,該二叉樹變爲:

     1 -> NULL
   /  \
  2 -> 3 -> NULL
 / \    \
4-> 5 -> 7 -> NULL

思路:網上找的大神的代碼,但是還是有些看不懂,先記在這裏。

這個題與116題的區別在於116題中的是一個完美二叉樹。左右節點都存在,這個就只是一個普通的二叉樹了。題目中要求使用額外的常數空間。

代碼1,先記錄下來,這個代碼和下面最快代碼的時間相同。

class Solution {
    public Node connect(Node root) {
        Node queue = root;
        Node level = new Node(0);
        while (queue != null) {
            level.next = null;
            Node current = level;
            while (queue != null) {
                if (queue.left != null) {
                    current.next = queue.left;
                    current = current.next;
                }
                if (queue.right != null) {
                    current.next = queue.right;
                    current = current.next;
                }
                queue = queue.next;
            }
            queue = level.next;
        }
        return root;
    }
}   
  代碼2: 執行最快的代碼

這個是leetcode中最快的代碼,可以理解。這個最快的代碼應該是常數級的空間。最快的代碼我可以自己寫出來,但是要注意黑體的部分小心寫錯。

 class Solution {
    public Node connect(Node root) {
        helper(root);
        return root;
    }
    
    void helper(Node node){
        if(node == null)return;
        Node next = null;
        if(node.left != null){
            if(node.right != null){
                node.left.next = node.right;
            }else{
                next = node.next;
                while(next != null){
                    if(next.left != null){
                        node.left.next = next.left;
                        break;
                    }else if(next.right != null){
                        node.left.next = next.right;
                        break;
                    }
                    next = next.next;
                }
            }
        }
        if(node.right != null){
            next = node.next;
            while(next != null){
                if(next.left != null){
                    node.right.next = next.left;
                    break;
                }else if(next.right != null){
                    node.right.next = next.right;
                    break;
                }
                next = next.next;
            }
        }
        helper(node.right);
        helper(node.left);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章