Populating Next Right Pointers in Each Node
题目一:Populating Next Right Pointers in Each Node
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 to NULL
.
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
struct TreeLinkNode { int val; TreeLinkNode *left, *right, *next; TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {} }; /* 因为题目说了是全然二叉树。所以假设由节点next不为空的话,那么一定是root -> next -> left */ class Solution { public: void connect(TreeLinkNode *root) { if(!root || (root -> left == NULL && root -> right == NULL))return; if(root -> left)root -> left -> next = root -> right; if(root -> right && root -> next) root -> right -> next = root -> next -> left; connect(root -> left); connect(root -> right); } };
题目二:Populating Next Right Pointers in Each Node II
Follow up for problem "Populating Next Right Pointers in Each Node".
What if the given tree could be any binary tree? Would your previous solution still work?
Note:
- You may only use constant extra space.
For example,
Given the following binary tree,
1 / \ 2 3 / \ \ 4 5 7
After calling your function, the tree should look like:
1 -> NULL / \ 2 -> 3 -> NULL / \ \ 4-> 5 -> 7 -> NULL与上面不同之处在于本题的二叉树能够是随意形式的。
因此,对一个节点须要向右找到第一个节点。
对于left。假设right不存在,就在father的next节点去找left/right。依次找下去。
对于right,直接在father的next节点開始找
class Solution { public: void connect(TreeLinkNode *root) { if(!root || (root -> left == NULL && root -> right == NULL))return; TreeLinkNode* p ,*q; if(root -> left) { if(root -> right)root -> left -> next = root -> right; else { q = NULL; p = root -> next; while(p != NULL)//沿着父亲的next指针一直寻找 { if(p -> left) { q = p -> left; break; } else if(p -> right) { q = p -> right; break; } p = p -> next; } root -> left -> next = q; } } if(root -> right) { q = NULL; p = root -> next; while(p != NULL) { if(p -> left) { q = p -> left; break; } else if(p -> right) { q = p -> right; break; } p = p -> next; } root -> right -> next = q; } connect(root -> right);//注意要先构造右子树 connect(root -> left); } };
相关文章
- node-多进程
- Leetcode: Populating Next Right Pointers in Each Node
- nodemon command is not recognized in terminal for node js server
- node - 关于package.json
- Module build failed (from ./node_modules/eslint-loader/index.js)
- NODE学习:利用nodeJS去抓网页的信息
- Node.js 常用命令
- Zookeeper超级用户使用案例:How to remove ACL protected ZK Node
- node.js服务端存储用户密码md5加密
- svn update 产生Node remains in conflict的问题
- 浅析为什么推荐使用唯一不变的 id 作为 key、使用index作为key会导致的问题(复用错误、组件类型propsData或文本node触发重新渲染等问题)
- 浅析部署遇到的2个报错:Caused by: java.net.SocketTimeoutException: connect timed out的原因及解决、no suitable node (host-mode port already in use on 1 node)原因及解决
- vue These dependencies were not found: * core-js/modules/es.array.iterator in ./node_modules/@babe
- 【LeetCode】237. Delete Node in a Linked List