Populating Next Right Pointers in Each Node

https://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node/

Given a binary tree

    struct TreeLinkNode {

      TreeLinkNode *left;

      TreeLinkNode *right;

      TreeLinkNode *next;

    }

 

Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.

Initially, all next pointers are set to NULL.

Note:

  • You may only use constant extra space.
  • You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).

 

For example,
Given the following perfect binary tree,

         1

       /  \

      2    3

     / \  / \

    4  5  6  7

 

After calling your function, the tree should look like:

         1 -> NULL

       /  \

      2 -> 3 -> NULL

     / \  / \

    4->5->6->7 -> NULL

解题思路:

广度遍历,对于每个正在遍历的节点root,将root.left.next设置为root.right,root.right.next设置为root.next。

递归的广度遍历较为容易理解,不断的去处理左子树和右子树。

/**

 * Definition for binary tree with next pointer.

 * public class TreeLinkNode {

 *     int val;

 *     TreeLinkNode left, right, next;

 *     TreeLinkNode(int x) { val = x; }

 * }

 */

public class Solution {

    public void connect(TreeLinkNode root) {

        if(root == null){

            return;

        }

        if(root.left != null){

            root.left.next = root.right;

            if(root.next != null){

                root.right.next = root.next.left;

            }else{

                root.right.next = null;

            }

        }

        connect(root.left);

        connect(root.right);

    }

}

非递归的代码如下

/**

 * Definition for binary tree with next pointer.

 * public class TreeLinkNode {

 *     int val;

 *     TreeLinkNode left, right, next;

 *     TreeLinkNode(int x) { val = x; }

 * }

 */

public class Solution {

    public void connect(TreeLinkNode root) {

        if(root == null){

            return;

        }

        while(root.left != null){

            TreeLinkNode temp = root;

            while(root != null){

                root.left.next = root.right;

                if(root.next != null){

                    root.right.next = root.next.left;

                }

                root = root.next;

            }

            root = temp;

            root = root.left;

        }

    }

}

两层遍历,外层root从左节点往下,内层从next往后,注意几个null的判断。注意外层需要一个temp的引用指向该层的第一个节点。每一层结束的时候,回到这第一个节点,从左子树往下。

你可能感兴趣的:(right)