zoukankan      html  css  js  c++  java
  • 第116题:填充每个节点的下一个右侧节点指针

    一. 问题描述

    给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

    struct Node {

      int val;

      Node *left;

      Node *right;

      Node *next;

    }

    填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

    初始状态下,所有 next 指针都被设置为 NULL。

    示例:

    输入:{"$id":"1","left":{"$id":"2","left":{"$id":"3","left":null,"next":null,"right":null,"val":4},"next":null,"right":{"$id":"4","left":null,"next":null,"right":null,"val":5},"val":2},"next":null,"right":{"$id":"5","left":{"$id":"6","left":null,"next":null,"right":null,"val":6},"next":null,"right":{"$id":"7","left":null,"next":null,"right":null,"val":7},"val":3},"val":1}

    输出:{"$id":"1","left":{"$id":"2","left":{"$id":"3","left":null,"next":{"$id":"4","left":null,"next":{"$id":"5","left":null,"next":{"$id":"6","left":null,"next":null,"right":null,"val":7},"right":null,"val":6},"right":null,"val":5},"right":null,"val":4},"next":{"$id":"7","left":{"$ref":"5"},"next":null,"right":{"$ref":"6"},"val":3},"right":{"$ref":"4"},"val":2},"next":null,"right":{"$ref":"7"},"val":1}

    解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。

    提示:

    你只能使用常量级额外空间。

    使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。

    二. 解题思路

    本题思路:采用层序遍历+递归的方式进行求解。

    步骤一:建立递归函数(临时变量list存储某一层的节点)。

    步骤二:将list表中节点,依次用next连接起来,并最后一个节点的next==null,将list的节点子树依次存储到newlist中,重复步骤二进行递归。

    步骤三:直到无子树时则返回。

    三. 执行结果

    执行用时 :1 ms, 在所有 java 提交中击败了46.65%的用户

    内存消耗 :38 MB, 在所有 java 提交中击败了47.98%的用户

    四. Java代码

    class Solution {
        public Node connect(Node root) {
                 if(root==null) {
                return root;
            }else {
                List<Node> list=new ArrayList<Node>();
                list.add(root);
                getTree(list);
                return root;
            }
        }
        
        public void getTree(List<Node> list) {
            if(list.size()==0) {
                return;
            }
            List<Node> data=new ArrayList<Node>();
            for(int i=0;i<list.size();i++) {
                if(i==list.size()-1) {
                    list.get(i).next=null;
                }else {
                    list.get(i).next=list.get(i+1);
                }
                
                if(list.get(i).left!=null) {
                    data.add(list.get(i).left);
                }
                if(list.get(i).right!=null) {
                    data.add(list.get(i).right);
                }
            }
            getTree(data);
        }
        
    }
  • 相关阅读:
    linux安装memcache及memcache扩展
    jsop
    用户权限集中管理方案
    linux系统优化配置
    APICloud
    laravel中使用mgirations创建和迁移数据库
    无限分类
    laravel中的验证及利用uploadify上传图片
    Laravel框架数据库CURD操作、连贯操作使用方法
    php 将二维数组批量插入到数据库中
  • 原文地址:https://www.cnblogs.com/xiaobaidashu/p/11876449.html
Copyright © 2011-2022 走看看