二叉树-BFS

文章目录

快速复习

二叉树的右视图

添加链接描述

import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;

class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer>ans=new ArrayList<>();
        if(root==null){
            return ans;
        }

        Deque<TreeNode> queue=new LinkedList<>();
        queue.addLast(root);
        while (!queue.isEmpty()){
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.removeFirst();
                if(i==size-1){
                    ans.add(node.val);
                }
                if(node.left!=null){
                    queue.addLast(node.left);
                }
                if(node.right!=null){
                    queue.addLast(node.right);
                }
            }
        }
        return ans;
    }
}

二叉树的层序遍历

添加链接描述

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> ans=new ArrayList<>();
        if(root==null)
            return ans;
        
        Deque<TreeNode> queue=new LinkedList<>();
        queue.addLast(root);

        while (!queue.isEmpty()){
            int size = queue.size();
            List<Integer> tmp=new ArrayList<>();
            for (int i = 0; i < size; i++) {
                TreeNode curNode = queue.removeFirst();
                tmp.add(curNode.val);
                if(curNode.left!=null)
                    queue.addLast(curNode.left);
                if(curNode.right!=null)
                    queue.addLast(curNode.right);
            }
            ans.add(tmp);
            //ans.add(0,tmp);这样就把层次反过来了。
        }
        return ans;
    }
}

层序遍历保存成链表

添加链接描述

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;

class Solution {
    ListNode[]ans;
    public ListNode[] listOfDepth(TreeNode root) {
        List<ListNode>tempList=new ArrayList<>();
        if (root==null){
            return ans;
        }
        Deque<TreeNode>queue=new ArrayDeque<>();
        queue.offer(root);
        while (!queue.isEmpty()){
            int size = queue.size();
            ListNode head=null;
            ListNode p=null;
            for (int i = 0; i < size; i++) {
                TreeNode poll = queue.poll();
                if(i==0){
                    head = new ListNode(poll.val);
                    p=head;
                }else {
                    ListNode temp=new ListNode(poll.val);
                    p.next=temp;
                    p=temp;
                }
                if(poll.left!=null){
                    queue.offer(poll.left);
                }
                if(poll.right!=null){
                    queue.offer(poll.right);
                }
            }
            tempList.add(head);
        }
        ans=new ListNode[tempList.size()];
        int idx=0;
        for (ListNode listNode : tempList) {
            ans[idx++]=listNode;
        }
        return ans;
    }
}

二叉树的锯齿形层序遍历

添加链接描述
相比上题需要记录当前层level

class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> ans=new ArrayList<>();
        if(root==null){
            return ans;
        }
        Deque<TreeNode>queue=new LinkedList<>();
        queue.addLast(root);
        int level=0; //多了一个这

        while (!queue.isEmpty()){
            int size = queue.size();
            List<Integer> temp=new ArrayList<>();
            for (int i = 0; i < size; i++) {
                TreeNode cur = queue.removeFirst();
                temp.add(cur.val);
                if(cur.left!=null){
                    queue.addLast(cur.left);
                }
                if(cur.right!=null){
                    queue.addLast(cur.right);
                }
            }
            level++;
            if(level%2==1){ //设置根为1层
                ans.add(temp);
            }else {
                Collections.reverse(temp);
                ans.add(temp);
            }

        }
        return ans;
    }
}

二叉树的最小深度

二叉树的最小深度

首先本题dfs和bfs都可以,但是bfs要更高效,面试肯定写bfs。

dfs

class Solution {
    int minDepth=Integer.MAX_VALUE;
    public int minDepth(TreeNode root) {
        if(root==null){
            return 0;
        }
        dfs(root,1);
        return minDepth;
    }

    private void dfs(TreeNode root, int depth) {
        if(root==null){
            return;
        }
        if(root.left==null && root.right==null){
            minDepth=Math.min(minDepth,depth);
            return;
        }
        dfs(root.left,depth+1);
        dfs(root.right,depth+1);
    }
}

bfs

class Solution {
    public int minDepth(TreeNode root) {
        if(root==null)
            return 0;

        Deque<TreeNode>queue=new LinkedList<>();
        queue.addLast(root);
        int minDepth=1;
        while (!queue.isEmpty()){
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode curNode = queue.remove();
                if(curNode.left==null && curNode.right==null) //第一个叶子节点即返回
                    return minDepth;
                if(curNode.left!=null)
                    queue.addLast(curNode.left);

                if(curNode.right!=null)
                    queue.addLast(curNode.right);
            }
            minDepth++;
        }
        return minDepth;
    }
}

二叉树最大宽度

添加链接描述
本题难点在于两节点之间的null节点也算数。
树的层序遍历是肯定的,在基础求宽度的题目基础上,记录节点在当前层的横向索引位置pos。然后最右和最左pos的差值即为宽度。

class Solution {
    class Node{ //这不比map省内存多了
        int pos;
        TreeNode node;
        public Node(TreeNode node,int pos){
            this.node=node;
            this.pos=pos;
        }
    }
    public int widthOfBinaryTree(TreeNode root) {
        if(root==null){
            return 0;
        }
        Deque<Node>queue=new ArrayDeque<>();
        queue.offer(new Node(root,1));
        int ans=-1;
        while (!queue.isEmpty()){
            int size=queue.size();
            int left=0;
            int right=0;
            for (int i = 0; i < size; i++) {
                Node poll = queue.poll();
                int pos=poll.pos;
                TreeNode node=poll.node;
                if(node.left!=null){
                    queue.offer(new Node(node.left,2*pos-1));
                }
                if(node.right!=null){
                    queue.offer(new Node(node.right,2*pos));
                }
                if(i==0){
                    left=pos;
                }
                if(i==size-1){
                    right=pos;
                }
            }
            //计算最大宽度
            ans=Math.max(ans,right-left+1);
        }
        return ans;
    }
}
上一篇:安卓手机相关工具类,很全很有用,附学习笔记+面试整理+进阶书籍


下一篇:BFS 算法解题套路框架