[LeetCode]problem 117. Populating Next Right Pointers in Each Node II
2016-06-10 00:38
543 查看
TAG
层序遍历 - 常量空间,通过next指针二叉树
link
方法
有了Populating next right pointers in each node I的铺垫,这道题就显得没有任何思维上的限制了。在上道题(完全二叉树)条件上,左孩子的右边必然是右孩子,右孩子的右边必然是下一个节点的左孩子,下一层的首节点必然是当前层首节点的左孩子。
当不是完全二叉树后,只需要把上面的假设全部换为一个find函数即可。find函数也非常直观:对左孩子的下一个节点,首先测试其右孩子是否为空,不为空则指向右孩子,为空时就和找右孩子的下一个节点完全一样。找右孩子的下一个节点,从当前节点的下一个节点依次的找,找到第一个左孩子或者右孩子非空的节点(找到非空的孩子指针就返回该指针)即可。接着依次处理该层下一个节点即可(这里刻意做一些速度提升——因为前面为其左孩子和右孩子连线时已经找到了下一个有非空孩子的节点,可以将上面的节点保留下来,能够避免一些重复判断。不过这点消耗应该是不大的,因为就是两个队孩子节点的非空判断)。找下层第一个节点,从该层第一个节点开始,找到第一个左孩子或右孩子非空的节点,该节点的非空左孩子或右孩子就是下层的第一个节点。
代码
/** * 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) { TreeLinkNode *levelFirstNode = root; while(levelFirstNode != nullptr) { TreeLinkNode *ptr = levelFirstNode; while(ptr != nullptr) { if(ptr->left != nullptr) { if(ptr->right != nullptr) { ptr->left->next = ptr->right; } else { ptr->left->next = findNextConnected(ptr->next); } } if(ptr->right != nullptr) { ptr->right->next = findNextConnected(ptr->next); } ptr = ptr->next; // duplicated } levelFirstNode = findDownLevelFirstNode(levelFirstNode); } } private : TreeLinkNode *findNextConnected(TreeLinkNode *ptr) { while(ptr != nullptr) { if(ptr->left != nullptr){ return ptr->left ;} else if(ptr->right != nullptr) { return ptr->right; } else { ptr = ptr->next; } } return nullptr; } TreeLinkNode *findDownLevelFirstNode(TreeLinkNode *ptr) { while(ptr != nullptr) { if(ptr->left != nullptr){ return ptr->left; } else if(ptr->right != nullptr){ return ptr->right; } else ptr = ptr->next; } return nullptr; } };
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- leetcode----Longest Substring Without Repeating Characters
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- 021-Merge Two Sorted Lists(合并两个排好序的单链表);leetcode
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解