首页 > 代码库 > 【LeetCode题目记录-7】为完全二叉树添加层指针

【LeetCode题目记录-7】为完全二叉树添加层指针

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

【分析1-原创】本质是游标思想的分层遍历,本博客里面有相关代码,最初似乎是《编程之美》中的类似题目,即“二叉树分层遍历”。

     

/**
     * Definition for binary tree with next pointer.
     * public class TreeLinkNode {
     *     int val;
     *     TreeLinkNode left, right, next;
     *     TreeLinkNode(int x) { val = x; }
     * }
     */
    public void connect(TreeLinkNode root) {
        if(root==null) return;
        List<TreeLinkNode> list=new ArrayList<TreeLinkNode>();
        list.add(root);
        int cur=0;
        while(cur<list.size()){
            int last=list.size();
            while(cur<last){
               TreeLinkNode temp=list.get(cur);
            if(temp.left!=null){
             list.add(temp.left);  
            }
             if(temp.right!=null){
             list.add(temp.right);  
            }
            if(cur<last-1){
                list.get(cur).next=list.get(cur+1);
            }
             cur++;  
            }
           
        }
       
}

【分析2-非原创】上面的遍历符合各种类型的二叉树,不一定非得是完全二叉树,而题目中限定了perfect binary tree。可以用更简洁的方法。例如,可以通过pre.left来判断是否探底。

参考:https://oj.leetcode.com/discuss/7327/a-simple-accepted-solution

void connect(TreeLinkNode *root) {
    if (root == NULL) return;
    TreeLinkNode *pre = root;
    TreeLinkNode *cur = NULL;
    while(pre->left) {
        cur = pre;
        while(cur) {
            cur->left->next = cur->right;
            if(cur->next) cur->right->next = cur->next->left;
            cur = cur->next;
        }
        pre = pre->left;
    }
}


【LeetCode题目记录-7】为完全二叉树添加层指针