LeetCode - 116. 填充每个节点的下一个右侧节点指针 - java

x33g5p2x  于2022-02-18 转载在 Java  
字(1.6k)|赞(0)|评价(0)|浏览(355)

LeetCode - 116. 填充每个节点的下一个右侧节点指针

题目解析

给了我们一棵两种特殊的二叉树之一:满二叉树,让我们将其转换成为孩子兄弟表示法。

解题思维一 : 层序遍历

可参考 这篇文章学习二叉树 这一篇就够了
找到框选的目录,点击跳转,里面讲的非常详细!

唯一需要注意的是:
1、我们不是打印,而是利用层序遍历来实现我们树节点next域值的修改。
2、获取每一层的节点个数,方便判断该节点是否有兄弟节点。

代码如下

  1. /*
  2. // Definition for a Node.
  3. class Node {
  4. public int val;
  5. public Node left;
  6. public Node right;
  7. public Node next;
  8. public Node() {}
  9. public Node(int _val) {
  10. val = _val;
  11. }
  12. public Node(int _val, Node _left, Node _right, Node _next) {
  13. val = _val;
  14. left = _left;
  15. right = _right;
  16. next = _next;
  17. }
  18. };
  19. */
  20. class Solution {
  21. public Node connect(Node root) {
  22. if(root == null){
  23. return root;
  24. }
  25. Queue<Node> queue = new LinkedList<>();
  26. queue.offer(root);
  27. while(!queue.isEmpty()){
  28. int size = queue.size();// 获取该层的节点个数
  29. for(int i = 0;i < size;i++){
  30. Node tmp = queue.poll();
  31. if(i < size -1){// 说明 i 节点的右侧至少2个节点
  32. tmp.next = queue.peek();
  33. }
  34. // 将不为空的左右子树 入队
  35. if(tmp.left != null){
  36. queue.offer(tmp.left);
  37. }
  38. if(tmp.right != null){
  39. queue.offer(tmp.right);
  40. }
  41. }
  42. }
  43. return root;
  44. }
  45. }

解题思维二: 使用已建立的 next 指针

一个棵树中,只有两种情况下,才有next的值。
第一种情况:两个节点之间是同一个父亲节点。

第二种情况:两个节点之间,不是同一个父亲节点。

思路:定义一个 leftRoot = root ,意为永远指向 最左边的根结点。

此时,是符合第一种情况【两个节点是同一个父亲节点】:leftRoot.left.next = leftRoot.right;

然后 leftRoot = leftRoot.left;

而且 leftRoot 和 head肯定不止移动一次,所以需要循环。

最后返回 根结点 root 就行了。

这题就完成了!

代码如下

  1. /*
  2. // Definition for a Node.
  3. class Node {
  4. public int val;
  5. public Node left;
  6. public Node right;
  7. public Node next;
  8. public Node() {}
  9. public Node(int _val) {
  10. val = _val;
  11. }
  12. public Node(int _val, Node _left, Node _right, Node _next) {
  13. val = _val;
  14. left = _left;
  15. right = _right;
  16. next = _next;
  17. }
  18. };
  19. */
  20. class Solution {
  21. public Node connect(Node root) {
  22. if(root == null){
  23. return root;
  24. }
  25. Node leftRoot = root;
  26. while(leftRoot.left != null){
  27. Node head = leftRoot;
  28. while(head != null){
  29. head.left.next = head.right;
  30. if(head.next != null){
  31. head.right.next = head.next.left;
  32. }
  33. head = head.next;
  34. }
  35. leftRoot = leftRoot.left;
  36. }
  37. return root;
  38. }
  39. }

附图

相关文章

最新文章

更多