一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情。
前言
每天一道算法题,死磕算法
题目
给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
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 指针连接,'#' 标志着每一层的结束。
分析
1. 从题目中提取关键字
- 给的是一个
完美二叉树,那说明给的是一个正三角形的二叉树,除了最右侧的二叉树的next指向null以外,其他节点的next都有值
2.这道题目的难点在哪里?
如果只是实现相同父节点下面的左节点的next指向右节点,那么这道题目就简单了,而这道题目的复杂之处就是节点5的next要指向节点6,这就复杂了,因为他们根本不在一个父节点下面
所以我们要想办法,如果让5的next指向6
因为2和3在同一层,所以5指向6也就是节点2的right指向节点3的left
所以除了遍历相同父节点的子节点以外,还需要遍历左子树的右节点,和右子树的左节点
题解
function traverse(node1:Node,node2:Node){
if(!node1 || !node2){
return;
}
node1.next = node2;
traverse(node1.left,node1.right);
traverse(node2.left,node2.right);
traverse(node1.right,node2.left);
}
function connect(root: Node | null): Node | null {
if(root === null){
return null;
}
traverse(root.left,root.right);
return root;
};