【leetcode】每日精选题详解之116. 填充每个节点的下一个右侧节点指针

   日期:2020-10-05     浏览:91    评论:0    
核心提示:        嗨,大家好,我是袁小厨(因为酷爱做饭,所以自己考取了厨师证)。之前一直看大家写的博客,学到了很多东西。然后最近萌生了自己写的想法,将自己知道的分享给需要的同学。以后每天会为大家分享leetcode精选题目的各种题解和Python, JS, JQ, CSS, PHP, JAVA的一些小Demo。请大家关注我,一起交流学习吧。 116. 填充每个节点的下一个右侧节点指针题目描述递归解法做题思路题目代码..

        嗨,大家好,我是袁小厨(因为酷爱做饭,所以自己考取了厨师证)。之前一直看大家写的博客,学到了很多东西。然后最近萌生了自己写的想法,将自己知道的分享给需要的同学。以后每天会为大家分享leetcode精选题目的各种题解和Python, JS, JQ, CSS, PHP, JAVA的一些小Demo。请大家关注我,一起交流学习吧。

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

  • 题目描述
  • 递归解法
    • 做题思路
    • 题目代码
  • 层次遍历(队列)
    • 做题思路
    • 题目代码
  • BFS
    • 做题思路
    • 题目代码
  • 总结

题目描述

递归解法

做题思路

这道题的含义意思就是将每层的节点用链表给连接起来,因为这个题目是完美二叉树,所以我们可以利用递归,然后还可以利用层次遍历。递归算法需要注意的地方就是,我们不能忽略了2节点的右孩子和3节点的左孩子这一条线。所以我们需要新建一个函数来进行递归。

题目代码

class Solution { 
    public Node connect(Node root) { 
        if(root==null){ 
            return null;
        }
        //将左右孩子传入函数中
        connectTwoNode(root.left,root.right);
        return root;

        
    }
    public void connectTwoNode(Node node1, Node node2){ 
           if(node1==null||node2==null){ 
               return ;
           }
           node1.next = node2;
           //三种需要连接的情况
           connectTwoNode(node1.left,node1.right);
           connectTwoNode(node2.left,node2.right);
           connectTwoNode(node1.right,node2.left);
    }

}

        

层次遍历(队列)

做题思路

关于层次遍历的思想大家可以参考这个文章二叉树的层次遍历。然后我们可以直接用层次遍历来做这个题及填充每个节点的右指针2。需要注意的事我们刚才说的递归法不适用做第二题。因为每个节点的孩子情况可能不一样。不是完美二叉树。

题目代码

class Solution { 
    public Node connect(Node root) { 
        //定义一个队列,用于层次遍历
        Queue<Node> queue = new LinkedList<Node>();
        if(root == null){ 
            return root;
        } 
        queue.offer(root);
        while(!queue.isEmpty()){ 
            int size = queue.size();
            //创建一个指针,用于连接该层,注意的是,这个指针的摆放位置,每一层更新一次
            Node temp = new Node(0);
            for(int i = 0 ; i < size ; i++){ 
                Node q = queue.poll();//出列
                temp.next = q;//指针指向该节点
                temp = temp.next;//移动指针
                Node left = q.left;
                Node right = q.right;
                if(left!=null){ 
                    queue.offer(left);
                }
                if(right!=null){ 
                    queue.offer(right);
                }
            }

        }
        return root;        
    }
}

BFS

做题思路

这个算法算是对刚才算法的改进,速度更快,内存更小。主要思想就是设置一个哑结点temp,游离在树之外,temp.next指向该层的头结点。然后一层一层的添加,用一个cur节点进行,定位,然后将其子节点连接起来,然后cur进行移动,再连接其子孩子,然后cur跳入下一层。pre的功能就是用来连接cur的子节点。该题思想和数组的双重循环类似。这个题目的思想是我跟题解里面的一个大神学习的,图也来自与大神。大家可以也可以自己去看一下。BFS题解


题目代码

 public Node connect(Node root) { 
        if (root == null)
            return root;
         //用来定位层
        Node cur = root;
        while (cur != null) { 
           //哑结点,游离在树之外,用来预定位层数
            Node dummy = new Node(0);
            //用来cur的子节点连接起来
            Node pre = dummy;
            //然后开始遍历当前层的链表
            while (cur != null) { 
               //左子树连接
                if (cur.left != null) { 
                    pre.next = cur.left;              
                    pre = pre.next;
                }
                //右子树连接
                if (cur.right != null) { 
                    pre.next = cur.right;
                    pre = pre.next;
                }
                //到该层的下一个节点
                cur = cur.next;
            }   
            //到下一层 
            cur = dummy.next;
        }
        return root;
    }

总结

该题做法挺多,学会这几种方法,可以对做其他题有很大帮助。目前做树的题目可以有自己的想法。希望和大家共同进步,对大家有帮助的话就点赞关注吧,每天都会更新哦。

作者:LeetCode
链接:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服