IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 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 指针连接,’#’ 标志着每一层的结束。

  • 方法一:递归
/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/

class Solution {
public:
    Node* connect(Node* root) {
        if(root==NULL) return root;
        Node *leftmost = root;//借助最左链遍历每一层
        while(leftmost->left!=NULL){
            Node *head = leftmost;//依次遍历该层每一个节点
            while(head!=NULL){
                head->left->next = head->right;//有共父亲节点的相邻节点
                if(head->next!=NULL)//没有共同父亲节点的相邻节点,二者相互间隔
                    head->right->next = head->next->left;
                head = head->next;
            }
            leftmost = leftmost->left;//为遍历下一层做准备
        }
        return root;
    }
};
  • 时间复杂度O(n)

  • 空间复杂度O(1)

  • 思路

    • 层序遍历,使用已经建立的上层的next指针,为该层的节点设置next指针。
    • 设置leftmost作为遍历每一层的时每一层的起点,第一层不需要设置next指针,从第二层开始的每一层借助上一层的next指针设置该层的指针
      • 第一种情况是连接同一个父节点的两个子节点,左孩子的next指针指向右孩子
      • 第二种情况是二者没有共同的父亲节点,右孩子的next指针指向其父亲节点next指针所指的节点的左孩子
  • 方法二:递归

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/

class Solution {
public:
    Node* connect(Node* root) {
        if(root==NULL) return root;//处理根节点为空的情况
        if(root->left==NULL) return root;//其余情况都是在此处返回
        //设置root节点的左孩子的next指针
        root->left->next = root->right;
        if(root->next) root->right->next = root->next->left;//设置root节点的右孩子的next指针
        connect(root->left);//以左孩子为根递归
        connect(root->right);//以右孩子为根递归
        return root;
    }
};
  • 时间复杂度O(n)

  • 空间复杂度O(logn)

  • 思路

    • 对每一个节点,填充它左右孩子的next指针,再对它的左右孩子进行递归调用,向下深入。
  • 方法三:递归二

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/

class Solution {
public:
    Node* connect(Node* root) {
        if(root==NULL) return root;
        Node *left = root->left;//root的左孩子
        Node *right = root->right;//root的右孩子
        while(left!=NULL){//left的next设置为right,不断向下深入
            left->next = right;
            left = left->right;
            right = right->left;
        }
        connect(root->left);
        connect(root->right);
        return root;
    }
};
  • 时间复杂度O(n)
  • 空间复杂度O(logn)
  • 思路
    • 对每一个节点root,它的左孩子不断向右走,右孩子不断向左走,二者在同一层中始终是相邻的,即left->next=right,直到left为空
    • 再分别递归调用root的左右孩子为根,不断向下深入。

方法三参考详解

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 09:36:03  更:2021-08-28 09:36:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:37:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码