(while代替遞歸)填充每一個節點的下一個右側節點指針(1.用while + queue實現廣度優先遍歷即bfs 2.將節點水平串聯起來 3.Queue的offer添加和poll返回並移除方法)

給定一個二叉樹node

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}
填充它的每一個 next 指針,讓這個指針指向其下一個右側節點。若是找不到下一個右側節點,則將 next 指針設置爲 NULL。





網絡

初始狀態下,全部 next 指針都被設置爲 NULL。函數

 

進階:指針

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

code

示例:blog

輸入:root = [1,2,3,4,5,null,7]
輸出:[1,#,2,3,#,4,5,7,#]
解釋:給定二叉樹如圖 A 所示,你的函數應該填充它的每一個 next 指針,以指向其下一個右側節點,如圖 B 所示。
 


遞歸

提示:leetcode

樹中的節點數小於 6000
-100 <= node.val <= 100
it


來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。


io

/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;
    public Node next;

    public Node() {}
    
    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, Node _left, Node _right, Node _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
};
*/

class Solution {
    public Node connect(Node root) {
        if(root == null){
            return null;
        }
        
        Queue<Node> q = new LinkedList<>();
        q.offer(root);

        while(!q.isEmpty()){
            int n = q.size();
            Node last = null;
            for(int i=1; i<= n; i++){
                Node f = q.poll();
                if(f.left != null){
                    q.offer(f.left);
                }
                if(f.right != null){
                    q.offer(f.right);
                }

                if(i != 1){
                    last.next = f;
                }
                last = f;
            }
        }

        return root;
    }
}
相關文章
相關標籤/搜索