Populating Next Right Pointers in Each Node(medium)
来源:互联网 发布:php ini set 不起作用 编辑:程序博客网 时间:2024/06/06 02:04
【题目】
Given a binary tree
struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; }
Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set toNULL
.
Initially, all next pointers are set to NULL
.
Note:
- You may only use constant extra space.
- You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).
For example,
Given the following perfect binary tree,
1 / \ 2 3 / \ / \ 4 5 6 7
After calling your function, the tree should look like:
1 -> NULL / \ 2 -> 3 -> NULL / \ / \ 4->5->6->7 -> NULL
【题意】 如果有右孩子,则使其next为右孩子,否则为null
【分析】
由于只能用常量级别的额外存储空间,所以深度搜索是不能用的,因为递归是需要栈的,因此空间复杂度将是 O(logn)。同理广度搜索也不能用,因为队列也是占用空间的,空间占用还高于 O(logn)。但是核心仍然是广度搜索,但是我们可以借用 next 指针,做到不需要队列就能完成广度搜索,如果当前层所有结点的next 指针已经设置好了,那么据此,下一层所有结点的next指针 也可以依次被设置。
【实现】
/** * Definition for binary tree with next pointer. * struct TreeLinkNode { * int val; * TreeLinkNode *left, *right, *next; * TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {} * }; */class Solution {public: void connect(TreeLinkNode *root) { if(NULL == root) return; TreeLinkNode* curLev; while(root -> left != NULL){ curLev = root; while(curLev != NULL){ curLev -> left -> next = curLev -> right; if(curLev -> next != NULL) curLev -> right -> next = curLev -> next -> left; curLev = curLev -> next; } root = root -> left; } }};
参考:
思路:
很棒的一道题,可以认为是先序遍历。
(1)根据题述:左孩子为空,则右孩子一定为空,所以左孩子为空,则return
(2)如果左孩子不为空,则右孩子一定不为空,所以链接左孩子和右孩子即可(左孩子的next赋值为右孩子)
(3)由于先序遍历,所以父节点的next比子节点的next先被设置,故父节点不同的两个子节点进行连接,就可以用到父节点的next,整题的精华便是:root->right->next = root->right
/** * Definition for binary tree with next pointer. * struct TreeLinkNode { * int val; * TreeLinkNode *left, *right, *next; * TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {} * }; */class Solution {public: void connect(TreeLinkNode *root) { if(root == NULL || root -> left == NULL) { return; } root->left->next = root->right; if(root->next != NULL) { root->right->next = root->next->left; } connect(root->left); connect(root->right); return; }};
- Populating Next Right Pointers in Each Node(medium)
- [Leetcode 116, Medium] Populating Next Right Pointers in Each Node
- LeetCode #116 - Populating Next Right Pointers in Each Node - Medium
- Populating Next Right Pointers in Each Node
- Populating Next Right Pointers in Each Node
- Populating Next Right Pointers in Each Node
- Populating Next Right Pointers in Each Node
- Populating Next Right Pointers in Each Node
- Populating Next Right Pointers in Each Node
- Populating Next Right Pointers in Each Node
- Populating Next Right Pointers in Each Node
- Populating Next Right Pointers in Each Node
- Populating Next Right Pointers in Each Node
- Populating Next Right Pointers in Each Node
- Populating Next Right Pointers in Each Node
- Populating Next Right Pointers in Each Node
- Populating Next Right Pointers in Each Node
- Populating Next Right Pointers in Each Node
- Java中 Class.getSimpleName()的作用
- 国外博士论文下载~
- 字符流与字节流的转换
- 公钥,私钥,证书
- 机器学习算法比较
- Populating Next Right Pointers in Each Node(medium)
- 对比几种无线技术在智能家居的应用
- 2.工厂模式
- 练习题 安全的密码
- Java线程
- Android Studio出现UnsupportedClassVersionError Unsupported major.minor version 52.0
- WEB-INF目录 与 META-INF目录的作用
- 强悍的vim —— 变量的访问
- SDWebImage如何支持的WebP格式