欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode之广度优先搜索

程序员文章站 2022-06-12 09:01:55
...

993. 二叉树的堂兄弟节点

在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。
如果二叉树的两个节点深度相同,但父节点不同,则它们是一对堂兄弟节点。
我们给出了具有唯一值的二叉树的根节点 root,以及树中两个不同节点的值 x 和 y。
只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true。否则,返回 false。

示例 1:
输入:root = [1,2,3,4], x = 4, y = 3
输出:false
leetcode之广度优先搜索

示例 2:
输入:root = [1,2,3,null,4,null,5], x = 5, y = 4
输出:true
leetcode之广度优先搜索
示例 3:
输入:root = [1,2,3,null,4], x = 2, y = 3
输出:false

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isCousins(TreeNode root, int x, int y) {
        if(root==null||x==root.val||y==root.val) return false;
        Queue<TreeNode> que=new LinkedList<>();
        TreeNode xnode=null,ynode=null,xfather=null,yfather=null;
        que.offer(root);
        while(!que.isEmpty()){
            int size=que.size();
            while(size-->0){
                TreeNode temp= que.poll();
                if(temp.left!=null){
                    que.offer(temp.left);
                    if(temp.left.val==x){
                        xnode=temp.left;
                        xfather=temp;
                    }
                    if(temp.left.val==y){
                        ynode=temp.left;
                        yfather=temp;
                    }
                }
                if(temp.right!=null){
                    que.offer(temp.right);
                    if(temp.right.val==x){
                        xnode=temp.right;
                        xfather=temp;
                    }
                    if(temp.right.val==y){
                        ynode=temp.right;
                        yfather=temp;
                    }
                }
                if(xnode!=null&&ynode!=null){
                    return xfather!=yfather;
                }else if(xnode==null&&ynode==null){
                    
                }else if(size==0){
                    return false;
                }
            }
        }
        return false;
    }
}

111. 二叉树的最小深度

给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。

示例:
给定二叉树 [3,9,20,null,null,15,7],
leetcode之广度优先搜索
返回它的最小深度 2.

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int minDepth(TreeNode root) {
        if(root==null) return 0;
        if(root.left==null&&root.right==null) return 1;
        Queue<TreeNode> que=new LinkedList<>();
        int count=1;
        que.offer(root);
        while(!que.isEmpty()){
            int len=que.size();
            while(len-->0){
                TreeNode temp=que.poll();
                if(temp.left==null&&temp.right==null) return count;
                if(temp.left!=null){
                   que.offer(temp.left);
                }
                if(temp.right!=null){
                    que.offer(temp.right);
                }
            }
            count++;
        }
        return count;
    }
}

101. 对称二叉树

给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
但是这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

思路:递归实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSymmetric(TreeNode root) {
       return balance(root,root);
    }

    boolean balance(TreeNode p,TreeNode q){
        if(p==null&&q==null) return true;
        if(p==null||q==null) return false;
        return p.val==q.val&&balance(p.left,q.right)&&balance(p.right,q.left);
    }
}

思路:非递归实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSymmetric(TreeNode root) {
       return balance(root,root);
    }

    boolean balance(TreeNode p,TreeNode q){
        Queue<TreeNode> que=new LinkedList<>();
        que.offer(p);
        que.offer(q);
        while(!que.isEmpty()){
            TreeNode u=que.poll();
            TreeNode v=que.poll();
            if(u==null&&v==null) continue;
            if(u==null||v==null||u.val!=v.val) return false;

            que.offer(u.left);
            que.offer(v.right);
            que.offer(u.right);
            que.offer(v.left);
        }
        return true;
    }
}

剑指 Offer 32 - II. 从上到下打印二叉树 II

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

例如:
给定二叉树: [3,9,20,null,null,15,7],

返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> lists=new ArrayList<>();
        Queue<TreeNode> que=new LinkedList<>();
        if(root==null) return lists;
        que.offer(root);
        while(!que.isEmpty()){
            int len=que.size();
            List<Integer> list=new ArrayList<>();
            while(len-->0){
                TreeNode temp=que.poll();
                list.add(temp.val);
                if(temp.left!=null){
                    que.offer(temp.left);
                }
                if(temp.right!=null){
                    que.offer(temp.right);
                }
            }
            lists.add(list);
        }
        return lists;
    }
}