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

    116. 填充每个节点的下一个右侧节点指针

    题目链接: 116. 填充每个节点的下一个右侧节点指针(中等)

    题目描述

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

    struct Node {
    int val;
    Node *left;
    Node *right;
    Node *next;
    }

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

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

    进阶:

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

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

    示例:

    输入:root = [1,2,3,4,5,6,7]
    输出:[1,#,2,3,#,4,5,6,7,#]
    解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。

    提示:

    • 树中节点的数量少于 4096

    • -1000 <= node.val <= 1000

    题解

    思路:层次遍历,遍历每一层时,只要遍历到的当前节点不是这层的最后一个节点,就把它的next域链接起来。

    代码(C++):

    struct Node {
        int val;
        Node* left;
        Node* right;
        Node* next;
        Node(int value) : val(value), left(nullptr), right(nullptr), next(nullptr) {}
    };
    ​
    class Solution {
    public:
        Node* connect(Node* root) {
            queue<Node*> que;
            if (root != nullptr) que.push(root);
            while (!que.empty()) {
                int size = que.size();
                for (int i = 0; i < size; i++) {
                    Node* node = que.front();
                    que.pop();
                    if (size - i != 1) node->next = que.front();
                    if (node->left) que.push(node->left);
                    if (node->right) que.push(node->right);
                }
            }
            return root;
        }
    };

    代码(Java):

    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) {
            Deque<Node> que = new LinkedList<>();
            if (root != null) que.offer(root);
            while (!que.isEmpty()) {
                int size = que.size();
                for (int i = 0; i < size; i++) {
                    Node node = que.poll();
                    if (size - i != 1) node.next = que.peek();
                    if (node.left != null) que.offer(node.left);
                    if (node.right != null) que.offer(node.right);
                }
            }
            return root;
        }
    }

    分析:

    • 时间复杂度:O(N)

    • 空间复杂度:O(N)

  • 相关阅读:
    C++ STL 介绍
    C++多线程学习笔记 (CreateThread()与 _beginthreadex() )
    Spring轻量级开发---基础知识和初体验
    J2EE面试题
    SSH的优缺点比较
    Qt容器类总结
    Qt Creater使用技巧
    Visual Studio里使用Qt
    Qt的学习之路
    解决Github下载慢和下载失败问题
  • 原文地址:https://www.cnblogs.com/wltree/p/15614603.html
Copyright © 2011-2022 走看看