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

118 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

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

题目

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

struct Node {

int val;

Node *left;

Node *right;

Node *next;

}

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

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

示例 1:

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

示例 2:

**输入:**root = [] 输出: []

提示:

  • 树中节点的数量在 [0, 212 - 1] 范围内
  • -1000 <= node.val <= 1000

进阶:

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

Related Topics

  • 深度优先搜索
  • 广度优先搜索
  • 链表
  • 二叉树

题目分析

这道题目给的是完全二叉树,考察二叉树的深度优先遍历和广度优先遍历的知识点,但我们考虑一下,能不能使用递归来解决这个问题呢

代码实现

这是代码的实现:

// Definition for a Node.

/*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) {
        dfs(root);
        return root;
    }
    public void dfs(Node root) {
        if (root == null) {
            return;
        }
        Node leftNode = root.left;
        Node rightNode = root.right;
        while (leftNode != null) {
            leftNode.next = rightNode;
            leftNode = leftNode.right;
            rightNode = rightNode.left;
        }
        dfs(root.left);
        dfs(root.right);
    }
}

这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉完全二叉树的深度优先遍历的使用和操作。

我这里用到了深度优先遍历和递归的方法,大体思路就是让左节点不断向右遍历,让右节点不断向左遍历,当两个节点都到叶子节点的时候,就能进行串联,其中leftNode.next = rightNode; 是串联的操作,就是左节点的下一个指针指向右节点

小知识

对于索引的设计,一般在where子句后面的列可以设置索引,一般设置的索引都是短索引,像text、bit等字端不要建立索引,这样不占用空间,另外不过度使用索引,因为索引的修改会耗时,同理,更新频繁的字段更不适合做索引,还有一个点就是不能区分出数据的字段不适合当索引,例如男女之类的字段,我们要尽量扩展索引而不是修改索引,因为修改索引是耗时的,还容易产生碎片,

总结

本篇文章主要解决了填充每个节点的下一个右侧节点指针的问题,从而实现完全二叉树的水平串联,这里用到了二叉树 的深度优先遍历和递归的思想,同时讲了一下索引的知识点,对这道题目感兴趣的小伙伴们尝试自行解决实现一下吧,嘿嘿,多动脑,勤思考,同时你有什么新的思路可以给我留言,我们一起学习