Day15:二叉树层序遍历 LeedCode 102.二叉树的层序遍历 199二叉树的右视图 637.二叉树的层平均值 101.对称二叉树 226.翻转二叉树

详细讲解,点击跳转

102. 二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000

思路:层序遍历需要依靠队列实现,队列先进先出,符合一层一层遍历的逻辑,同时还需要一个变量专门记录每层结点的个数

/**
 * 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 List<List<Integer>> levelOrder(TreeNode root) {
     List<List<Integer>> result= new LinkedList<>();
     Queue<TreeNode> queue = new LinkedList<>();
     if(root!=null){
        queue.offer(root);
     }
     while(queue.size()>0){
        int len = queue.size();//记录当层在节点个数
        LinkedList<Integer> list = new LinkedList<>();//存放当前层个数
        while(len-->0){
            TreeNode cur = queue.poll();
            list.add(cur.val);
            if(cur.left!=null){queue.offer(cur.left);}
            if(cur.right!=null){queue.offer(cur.right);}
        }
        result.add(list);
     }
     return result;
    }
}

以下题目都可以用层序遍历解决

107. 二叉树的层序遍历 II

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000

思路:将层序遍历的结果翻转即可

/**
 * 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 List<List<Integer>> levelOrderBottom(TreeNode root) {
         List<List<Integer>> result = new LinkedList<>();
         Queue<TreeNode> quque = new LinkedList<>();
         if(root!=null){
          quque.offer(root);
         }
         while(quque.size()>0){
            int len = quque.size();
            LinkedList<Integer> list = new LinkedList<>();
            while(len-->0){
                TreeNode temp=quque.poll();
             list.add(temp.val);
             if(temp.left!=null){quque.offer(temp.left);}
             if(temp.right!=null){ quque.offer(temp.right); }
            }
            result.add(list);
         }
          Collections.reverse(result);
          return result;
        
    }
}

199. 二叉树的右视图

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例 1:

输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

示例 2:

输入: [1,null,3]
输出: [1,3]

示例 3:

输入: []
输出: []

提示:

  • 二叉树的节点个数的范围是 [0,100]
  • -100 <= Node.val <= 100 

思路:将每层遍历的最后一个值加入结果集中即可

/**
 * 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 List<Integer> rightSideView(TreeNode root) {
        List<Integer> result = new LinkedList<>();
         Queue<TreeNode> quque = new LinkedList<>();
         if(root!=null){
          quque.offer(root);
         }
         while(quque.size()>0){
            int len = quque.size();
             TreeNode temp=null;
            while(len-->0){
             temp=quque.poll();
             if(temp.left!=null){quque.offer(temp.left);}
             if(temp.right!=null){ quque.offer(temp.right); }
            }
            result.add(temp.val);
         }
          return result;
    }
}

637. 二叉树的层平均值

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[3.00000,14.50000,11.00000]
解释:第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11 。
因此返回 [3, 14.5, 11] 。

示例 2:

输入:root = [3,9,20,15,7]
输出:[3.00000,14.50000,11.00000]

提示:

  • 树中节点数量在 [1, 104] 范围内
  • -231 <= Node.val <= 231 - 1

思路:求出每层的个数和结点val值之和

/**
 * 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 List<Double> averageOfLevels(TreeNode root) {
     List<Double> result= new LinkedList<>();
     Queue<TreeNode> queue = new LinkedList<>();
     if(root!=null){
        queue.offer(root);
     }
     while(queue.size()>0){
        int len = queue.size();//记录当层在节点个数
        long sums=0;
        for(int i=0;i<len;i++){
            TreeNode cur = queue.poll();
            sums+=cur.val;
            if(cur.left!=null){queue.offer(cur.left);}
            if(cur.right!=null){queue.offer(cur.right);}
        }
        result.add(sums*1.0/len);
     }
     return result;
    }
}

429. N 叉树的层序遍历

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

示例 1:

输入:root = [1,null,3,2,4,null,5,6]
输出:[[1],[3,2,4],[5,6]]

示例 2:

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]

提示:

  • 树的高度不会超过 1000
  • 树的节点总数在 [0, 104] 之间

思路:之前是左右孩子遍历,现在是将左右孩子换成集合

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
          List<List<Integer>> list=new ArrayList<>();
         if(root==null){
            return list;
         }
         Queue<Node> myQueue=new LinkedList<>();
         Node cur=root;
         myQueue.offer(cur);
        while(!myQueue.isEmpty()){
            List<Integer>list1=new ArrayList<>();
//队列中存放着上一层的所有结点
//len记录上一层所有结点的个数
            int len=myQueue.size();
            while(len-->0){
                Node temp=myQueue.poll();
                list1.add(temp.val);
              for(int i=0;i<temp.children.size();i++){
                myQueue.offer(temp.children.get(i));
              }
            }
            list.add(list1);
        }
    return list;
    }
}

515. 在每个树行中找最大值

给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

示例1:

输入: root = [1,3,2,5,3,null,9]
输出: [1,3,9]

示例2:

输入: root = [1,2,3]
输出: [1,3]

提示:

  • 二叉树的节点个数的范围是 [0,104]
  • -231 <= Node.val <= 231 - 1

/**
 * 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 List<Integer> largestValues(TreeNode root) {
  List<Integer> list=new ArrayList<>();
         if(root==null){
            return list;
         }
         Queue<TreeNode> myQueue=new LinkedList<>();
         TreeNode cur=root;
         myQueue.offer(cur);
        while(!myQueue.isEmpty()){
//队列中存放着上一层的所有结点
//len记录上一层所有结点的个数
            int len=myQueue.size();
            int maxx=Integer.MIN_VALUE;
            while(len-->0){
                TreeNode temp=myQueue.poll();
               maxx=Math.max(maxx,temp.val);
                if(temp.left!=null){myQueue.offer(temp.left);}
                if(temp.right!=null){myQueue.offer(temp.right);}
            }
            list.add(maxx);
        }
return list;
    } 
}

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

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

示例 1:

输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。

示例 2:

输入:root = []
输出:[]

提示:

  • 树中节点的数量在 [0, 212 - 1] 范围内
  • -1000 <= node.val <= 1000

进阶:

  • 你只能使用常量级额外空间。
  • 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;
    public Node next;

    public Node() {}
    
    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, Node _left, Node _right, Node _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
};
*/

class Solution {
    public Node connect(Node root) {
     Queue<Node> queue = new LinkedList<>();
     if(root!=null){
        queue.offer(root);
     }
     while(queue.size()>0){
        int len = queue.size();//记录当层在节点个数
        while(len-->0){
           Node cur = queue.poll();
           if(len>0){cur.next=queue.peek();}
           else{cur.next=null;}
            if(cur.left!=null){queue.offer(cur.left);}
            if(cur.right!=null){queue.offer(cur.right);
            }
        }
     
     }
     return root;
 
    }
}

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

给定一个二叉树:

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。

初始状态下,所有 next 指针都被设置为 NULL 。

示例 1:

输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。

示例 2:

输入:root = []
输出:[]

提示:

  • 树中的节点数在范围 [0, 6000] 内
  • -100 <= Node.val <= 100
    Queue<Node> queue = new LinkedList<>();
     if(root!=null){
        queue.offer(root);
     }
     while(queue.size()>0){
        int len = queue.size();//记录当层在节点个数
        while(len-->0){
           Node cur = queue.poll();
           if(len>0){cur.next=queue.peek();}
           else{cur.next=null;}
            if(cur.left!=null){queue.offer(cur.left);}
            if(cur.right!=null){queue.offer(cur.right);
            }
        }
     
     }
     return root;

104. 二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:

输入:root = [1,null,2]
输出:2

提示:

  • 树中节点的数量在 [0, 104] 区间内。
  • -100 <= Node.val <= 100
/**
 * 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 int maxDepth(TreeNode root) {
        int length=0;
         if(root==null){
            return length;
         }
         Queue<TreeNode> myQueue=new LinkedList<>();
         TreeNode cur=root;
         myQueue.offer(cur);
        while(!myQueue.isEmpty()){
//队列中存放着上一层的所有结点
//len记录上一层所有结点的个数
            int len=myQueue.size();
            while(len-->0){
                TreeNode temp=myQueue.poll();;
                if(temp.left!=null){myQueue.offer(temp.left);}
                if(temp.right!=null){myQueue.offer(temp.right);}
            }
       length++;
        }
       return length;
    }
}

111. 二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:2

示例 2:

输入:root = [2,null,3,null,4,null,5,null,6]
输出:5

提示:

  • 树中节点数的范围在 [0, 105] 内
  • -1000 <= Node.val <= 1000

 

/**
 * 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 int minDepth(TreeNode root) {
         int length=0;
         if(root==null){
            return length;
         }
         Queue<TreeNode> myQueue=new LinkedList<>();
         TreeNode cur=root;
         myQueue.offer(cur);
        while(!myQueue.isEmpty()){
            List<Integer>list1=new ArrayList<>();
         //队列中存放着上一层的所有结点
         //len记录上一层所有结点的个数
            int len=myQueue.size();
            while(len-->0){
                TreeNode temp=myQueue.poll();
                list1.add(temp.val);
                if(temp.left==null&&temp.right==null){return length+1;}
                if(temp.left!=null){myQueue.offer(temp.left);}
                if(temp.right!=null){myQueue.offer(temp.right);}

            }
           length++;
        }
       return length;

    }
}

226. 翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

输入:root = [2,1,3]
输出:[2,3,1]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目范围在 [0, 100] 内
  • -100 <= Node.val <= 100

思路:后序遍历,翻转子节点后翻转当前结点

/**
 * 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 TreeNode invertTree(TreeNode root) {
    reverse(root);
    return root;
    }
    public void reverse(TreeNode root){
        if(root==null) return;
        reverse(root.left);
        reverse(root.right);
        TreeNode left=root.left;
        TreeNode right=root.right;
        TreeNode temp =left;
        root.left=root.right;
        root.right=temp;
    }
}

101. 对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

  • 树中节点数目在范围 [1, 1000] 内
  • -100 <= Node.val <= 100

进阶:你可以运用递归和迭代两种方法解决这个问题吗?

1.确定传递参数

比较两颗树是否对称,传入两棵树的指针,返回值自然是bool类型。

2.确定终止条件

  • 左节点为空,右节点不为空,return false
  • 左不为空,右为空 return false
  • 左右都为空,对称,返回true
  • 左右都不为空,比较节点数值,不相同就return false

3.确定单层递归的逻辑

  • 比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。
  • 比较内侧是否对称,传入左节点的右孩子,右节点的左孩子
  • 如果左右都对称就返回true ,有一侧不对称就返回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 isSymmetric(TreeNode root) {
 if(root==null) return true;
   return travel(root.left,root.right);
    }

    public boolean travel(TreeNode left,TreeNode right){
        if(left == null&&right==null){return true;}
        if(left==null&&right!=null){return false;}
        if(left!=null&&right==null){return false;}
        if(left !=null&&right!=null){
            if(left.val!=right.val){return false;}
            boolean t1=travel(left.right,right.left);
            boolean t2=travel(left.left,right.right);
            return t1&&t2;
        }
        return false;
    }
}

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值