首页 > 代码库 > 117. Populating Next Right Pointers in Each Node II
117. 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
这道题是要将一棵树的每一层维护成一个链表,树本身是给定的。其实思路上很接近层序遍历Binary Tree Level Order Traversal,只是这里不需要额外维护一个队列。因为这里每一层我们会维护成一个链表,这个链表其实就是每层起始的那个队列,因此我们只需要维护一个链表的起始指针就可以依次得到整个队列了。接下来就是有左加左入链表,有右加右入链表,知道链表没有元素了说明到达最底层了。算法的复杂度仍然是对每个结点访问一次,所以是O(n),而空间上因为不需要额外空间来存储队列了,所以是O(1)。
维护层链表所需要: 首节点--也是下层的父节点开始节点, 临时节点用来链接链表向右
维护多个层链表需要: 临时节点(上层的head) 用来开始下层链表
代码如下:
public void connect(TreeLinkNode root) { public void connect(TreeLinkNode root) { if (root == null) return; TreeLinkNode temp = null;// 本层实现遍历的中介点 TreeLinkNode head = null;// 记住本层的头节点, 下次作为是否开启内循环的判断和内循环的开始点 TreeLinkNode cur = root;// 上一层的遍历点 while (cur != null) { // 内循环遍历上一层的节点 while (cur != null) { // 分情况看节点是否存在 if (cur.left != null) { // 本层节点的遍历节点是否存在 if (temp != null) { temp.next = cur.left; } else { //不存在的话先保存头结点 head = cur.left; } //遍历的传递 temp = cur.left; } if (cur.right != null) { if (temp != null) { temp.next = cur.right; } else { head = cur.right; } temp = cur.right; } // 上层遍历的传递 cur = cur.next; } //开启下层循环, 重置下层的头结点和遍历节点 cur = head; temp = null; head = null; } }
这道题是树的层序遍历Binary Tree Level Order Traversal的扩展,操作上会更加繁琐一些,因为是通过维护层链表来完成遍历,不过本质上还是一次广度优先搜索。
117. Populating Next Right Pointers in Each Node II
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。