記事ディレクトリ
各ノードIIの次の右ノードポインタを入力します
トピック分析
通常のツリー[不完全な二分木、つまり、ルートノードの右側のサブツリーがnullでない場合、左側の大きなサブツリーがnullでないことを意味しない]を指定します。これは、それぞれの下部を埋めていません。 node。右側のノードポインタ
I。子兄弟メソッドを使用して表現しましょう。
考え1:キューレベルの順序トラバーサル
コードは以下のように表示されます
/*
// 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 root;
}
Queue<Node> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int size = queue.size();
for(int i= 0;i < size;i++){
Node tmp = queue.poll();
if(i < size - 1){
tmp.next = queue.peek();
}
if(tmp.left != null){
queue.offer(tmp.left);
}
if(tmp.right != null){
queue.offer(tmp.right);
}
}
}
return root;
}
}
思考2:バイナリツリーをlogNリンクリストの組み合わせとして扱います
このアプローチの鍵は次のとおりです。
コードは以下のように表示されます
class Solution {
public Node connect(Node root) {
if(root == null){
return root;
}
// 将cur 当 一个链表
Node cur = root;
while(cur!=null){
// 在遍历当层的时候,将下一层的节点连接起来。
// 为了方便操作,使用了一傀儡节点
Node dummy = new Node();
// 每一层的起始节点 的 前一个节点。
Node pre = dummy;
while( cur != null){
// 遍历当前 cur 层的节点
if(cur.left != null){
// 如果 cur.left 不为空 pre的下一个节点 就是 cur.left
// 也就说将它们串起来【填充next值】
pre.next = cur.left;
// pre 移动,为下一次链接做准备
pre = pre.next;
}
if(cur.right != null){
// 如果 cur.right 不为空 pre的下一个节点 就是 cur.right
// 也就说将它们串起来【填充next值】
pre.next = cur.right;
// pre 移动,为下一次链接做准备
pre = pre.next;
}
// cur 移动,访问这一行的下一个节点。
cur =cur.next;
}
// 前面说到 dummy 是 下一层节点的 起始位置 的 傀儡节点
// 它的next指向的节点,就是 cur 下一层的遍历的起始位置
cur = dummy.next;
}
return root;
}
}
興味のある方はクリックしてください
LeetCodeのリンクリストの質問はすべてここにありますが、VIPとハッシュの質問を除いて、ほとんどすべてがそこにあります。二分木、ソート、ヒープ、スタック、キューの問題は段階的に改善されています。