LeetCode 面试题 特定深度节点链表

Leetcode 面试题 特定深度节点链表

  1. 给定一个二叉树,要求返回一个ListNode[]
  2. ListNode[]中每个节点i代表二叉树中第i从左到右所有节点构成的链表

思路: BFS

  1. 遍历过程中对每层节点创建一个ListNode链表,并将头节点放入返回参数ListNode[]

执行结果: 通过
执行用时:1 ms , 在所有 Java 提交中击败了 99.13% 的用户
内存消耗:38.2 MB , 在所有 Java 提交中击败了 100.00% 的用户

/*广度优先遍历*/
class Solution {
    public ListNode[] listOfDepth(TreeNode tree) {
        //返回参数
        List<ListNode> ansList = new ArrayList<>();
        //边界情况
        if(tree==null)
            return new ListNode[]{};

        //bfs队列(提前加入根节点)
        List<TreeNode> bfs = new LinkedList<>();
        bfs.add(tree);
        //记录每层节点数目(当前层oldNum,下一层newNum)
        int oldNum = 1, newNum = 0;
        //添加该层链表头节点(虚拟头节点,方便后续操作)
        ListNode head = new ListNode(-1);
        ansList.add(head);
        while(!bfs.isEmpty()) {
            TreeNode node = bfs.get(0);
            bfs.remove(0);
            oldNum--;
            //更新链表
            head.next = new ListNode(node.val);
            head = head.next;
            //下层节点入队
            if(node.left!=null) {
                bfs.add(node.left);
                newNum++;
            }
            if(node.right!=null) {
                bfs.add(node.right);
                newNum++;
            }
            //遍历层交替
            if(oldNum==0) {
                oldNum = newNum;
                newNum = 0;
                if(oldNum!=0) {
                    head = new ListNode(-1);
                    ansList.add(head);
                }
            }
        }
        //List转数组,同时将每层链表虚拟头节点去除
        ListNode[] ans = new ListNode[ansList.size()];
        for(int i=0; i<ansList.size(); i++)
            ans[i] = ansList.get(i).next;

        return ans;
    }
}
posted @ 2020-07-25 09:17  CodeSPA  阅读(120)  评论(0编辑  收藏  举报