zoukankan      html  css  js  c++  java
  • LeetCode——Populating Next Right Pointers in Each Node

    Description:

    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

    看到这个题目首先想到的是按层遍历二叉树,然后对每一层做处理,但是仔细读题发现这个做法不好,因为题目要求空间复杂度是O(1):
    • 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).

      这样可以很容易想到一个非常简单类似前序遍历的方法:

    /**
     * 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 || root.left == null) {
                return ;
            }
            
            root.left.next = root.right;
            
            if(root.next != null) {
                root.right.next = root.next.left;
            }
            
            connect(root.left);
            connect(root.right);
            
            return;
        }
    }

    虽然上边这种解法是可以AC的,但是也不符合题意,因为这种解法要消耗O(logh)的辅助递归栈空间。

    这样的话就要消去递归用循环来写就行了。这样空间复杂度就是O(1),时间复杂度是O(logh);

    代码:

    /**
     * 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 || root.left == null) {
                return ;
            }
            
            TreeLinkNode cur;
            
            while(root.left != null) { //深度优先遍历左子树,目的是获取每一层的第一个节点
                cur = root;
                while(cur != null) { //遍历一层的每一个节点,并用next指针连接
                    cur.left.next = cur.right;
                    if(cur.next != null) {
                        cur.right.next = cur.next.left;
                    }
                    cur = cur.next;
                }
                root = root.left;
            }
            
            
            return;
        }
    }

    这题数据很水,递归也能过。

  • 相关阅读:
    转角色权限系统的一些概念
    error message cs0012
    关于Action返回结果类型的事儿(下)
    MVC中权限的知识点及具体实现代码
    iis7 发布mvc3 遇到的HTTP错误 403.14Forbidden Web 服务器被配置为不列出此目录的内容及Login on failed for "IIS APPPOOL\ASP.NET v4.0"问题
    关于获取时间段的整理片段
    ASP.NET MVC – 关于Action返回结果类型的事儿(上)
    Lucene 查询权重排序因子解释(备查)
    Lucene代替SQL Server NewGuid获取随机结果
    如何在Web数据挖掘中保证用户访问速度的一点实践(SQLite+Quartz)
  • 原文地址:https://www.cnblogs.com/wxisme/p/4847452.html
Copyright © 2011-2022 走看看