微信改版,加星标不迷路!
每日一算法-填充同一层的兄弟节点
给定一个二叉树
struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; }
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL
。
说明:
你只能使用额外常数空间。
使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
你可以假设它是一个完美二叉树(即所有叶子节点都在同一层,每个父节点都有两个子节点)。
示例:
给定完美二叉树,
1 / \ 2 3 / \ / \ 4 5 6 7
调用你的函数后,该完美二叉树变为:
1 -> NULL / \ 2 -> 3 -> NULL / \ / \ 4->5->6->7 -> NULL
解析
思路
两种思路
第一种思路:迭代
(此处忽略)
第二种思路:递归
由于是完全二叉树,所以若节点的左子结点存在的话,其右子节点必定存在,所以左子结点的next指针可以直接指向其右子节点,对于其右子节点的处理方法是,判断其父节点的next是否为空,若不为空,则指向其next指针指向的节点的左子结点,若为空则指向NULL。
实现代码
实现方式:递归
class Solution {
public:
int i = 0 ;
void connect(TreeLinkNode *root) {
i++;
if(root && i == 1){
root->next = NULL;
}
if (!root) return;
if (root->left) root->left->next = root->right;
if (root->right) root->right->next = root->next? root->next->left : NULL;
connect(root->left);
connect(root->right);
}
};
需要注意的地方
本题的难点:属于简单题,考察二叉树的遍历,并且在遍历的过程中做点事情。
今日问题
你为华为而感到自豪骄傲吗?为什么?
打卡格式:打卡第n天,答:...