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等字端不要建立索引,这样不占用空间,另外不过度使用索引,因为索引的修改会耗时,同理,更新频繁的字段更不适合做索引,还有一个点就是不能区分出数据的字段不适合当索引,例如男女之类的字段,我们要尽量扩展索引而不是修改索引,因为修改索引是耗时的,还容易产生碎片,
总结
本篇文章主要解决了填充每个节点的下一个右侧节点指针的问题,从而实现完全二叉树的水平串联,这里用到了二叉树 的深度优先遍历和递归的思想,同时讲了一下索引的知识点,对这道题目感兴趣的小伙伴们尝试自行解决实现一下吧,嘿嘿,多动脑,勤思考,同时你有什么新的思路可以给我留言,我们一起学习