【树】117. 填充每个节点的下一个右侧节点指针 II
题目:
给定一个二叉树
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。

解答:
方法一:BFS
/* // 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; LinkedList<Node> queue = new LinkedList<>(); queue.addLast(root); while(!queue.isEmpty()){ int size = queue.size(); for(int i = 0;i<size;i++){ Node node = queue.removeFirst(); if(i<size-1){ node.next = queue.getFirst(); } if(node.left!=null) queue.addLast(node.left); if(node.right!=null) queue.addLast(node.right); } } return root; } }
方法二:
使用已有的next指针:(未掌握)
import javafx.util.Pair; class Solution { Node prev, leftmost; public void processChild(Node childNode) { if (childNode != null) { // If the "prev" pointer is alread set i.e. if we // already found atleast one node on the next level, // setup its next pointer if (this.prev != null) { this.prev.next = childNode; } else { // Else it means this child node is the first node // we have encountered on the next level, so, we // set the leftmost pointer this.leftmost = childNode; } this.prev = childNode; } } public Node connect(Node root) { if (root == null) { return root; } // The root node is the only node on the first level // and hence its the leftmost node for that level this.leftmost = root; // Variable to keep track of leading node on the "current" level Node curr = leftmost; // We have no idea about the structure of the tree, // so, we keep going until we do find the last level. // the nodes on the last level won't have any children while (this.leftmost != null) { // "prev" tracks the latest node on the "next" level // while "curr" tracks the latest node on the current // level. this.prev = null; curr = this.leftmost; // We reset this so that we can re-assign it to the leftmost // node of the next level. Also, if there isn't one, this // would help break us out of the outermost loop. this.leftmost = null; // Iterate on the nodes in the current level using // the next pointers already established. while (curr != null) { // Process both the children and update the prev // and leftmost pointers as necessary. this.processChild(curr.left); this.processChild(curr.right); // Move onto the next node. curr = curr.next; } } return root ; } }

浙公网安备 33010602011771号