算法学习:117.填充每个节点的下一个右侧节点指针II

117.填充每个节点的下一个右侧节点指针II

题目链接:力扣题目链接
难度:中等
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
示例
算法学习:117.填充每个节点的下一个右侧节点指针II_第1张图片
输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),’#’ 表示每层的末尾。

定义一个二叉树

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;
    }
}

思路:

和116题目说是完整二叉树,其实没有任何差别,一样的代码一样的逻辑一样的味道。

迭代代码

class Solution{
	public Node connect(Node root){
		if(root == null){
			return root;
		}
		Queue<Node> queue = new LinkedList<>();
		queue.offer(root);
		while(!queue.isEmpty()){
			int len = queue.size();
			Node node = null;
			//定义nodePre 每次把最后一个节点赋值给它 遍历结束后都指向null
			Node nodePre = null;
			for(int i =0;i<len;i++){
				if(i==0){
					//取出本层头一个节点
					nodePre = queue.poll();
					node = nodePre;
				}else{
					node = queue.poll();
					//本层的前一个节点next指向当前节点
					nodePre.next = node;
					//node和nodePre是同一个节点 利用nodePre指向null
					nodePre = nodePre.next;
				}
				if(node.left != null){
					queue.offer(node.left);
				}
				if(node.right != null){
					queue.offer(node.right);
				}
			}
			//本层的最后一个节点指向null
			nodePre.next = null;
		}
		return root;
	}
}

你可能感兴趣的:(数据结构与算法,java,算法,数据结构)