LeetCode ACM模式——二叉树篇(二)

刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com 

 二叉树的定义及创建见:

LeetCode ACM模式——二叉树篇(一)_要向着光的博客-优快云博客

目录

102. 二叉树的层序遍历

利用队列 

利用递归

107. 二叉树的层序遍历 II

199. 二叉树的右视图

637. 二叉树的层平均值

429. N 叉树的层序遍历

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


102. 二叉树的层序遍历

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

利用队列 

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

/**
 * @author light
 * @Description 二叉树的层序遍历
 *
 *
 * (利用队列:先进先出
 * @create 2023-08-15 14:17
 */
public class levelOrderTest {
	public static void main(String[] args) {
		Integer[] arr={3,9,20,null,null,15,7};
		BinaryTree2 tree2=new BinaryTree2(arr); //按数组方式创建二叉树
		List<List<Integer>> res=levelOrder(tree2.root);
		System.out.println(res);

	}

	public static List<List<Integer>> levelOrder(TreeNode root) {
		List<List<Integer>> result=new ArrayList<>();
		Deque<TreeNode> que=new ArrayDeque<>(); //队列
		if(root==null){
			return result;
		}
		que.offer(root);
		while(!que.isEmpty()){
			List<Integer> list=new ArrayList<>();
			int size=que.size();
			while(size>0){
				TreeNode node = que.poll();
				list.add(node.val);
				if(node.left!=null){
					que.offer(node.left);
				}
				if(node.right!=null){
					que.offer(node.right);
				}
				size--;
			}
			result.add(list);
		}
		return result;
	}
}

利用递归

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

/**
 * @author light
 * @Description 二叉树的层序遍历
 *
 * @create 2023-08-15 14:17
 */
public class levelOrderTest {
	public static void main(String[] args) {
		Integer[] arr={3,9,20,null,null,15,7};
		BinaryTree2 tree2=new BinaryTree2(arr); //按数组方式创建二叉树
		List<List<Integer>> res1=levelOrder2(tree2.root);
		System.out.println(res1);
	}
	public static List<List<Integer>> l=new ArrayList<>();

	public static List<List<Integer>> levelOrder2(TreeNode root) {
		checkFun(root,0);
		return l;
	}

	public static void checkFun(TreeNode root,int deep){
		if(root==null){
			return ;
		}
		deep++;

		if(l.size()<deep){
			List<Integer> item=new ArrayList<>();
			l.add(item);
		}

		l.get(deep-1).add(root.val);
		checkFun(root.left,deep);
		checkFun(root.right,deep);

	}
}

107. 二叉树的层序遍历 II

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


199. 二叉树的右视图

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

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

/**
 * @author light
 * @Description 二叉树的右视图
 *
 *
 * 思路:
 * 层序遍历的时候,判断是否遍历到单层的最后面的元素,
 * 如果是,就放进result数组中,随后返回result就可以了。
 * @create 2023-08-15 17:49
 */
public class RightSideViewTest {
	public static void main(String[] args) {
		Integer[] arr={1,2,3,null,5,null,4};
		BinaryTree2 tree2=new BinaryTree2(arr); //按数组方式创建二叉树
		List<Integer> res=rightSideView(tree2.root);
		System.out.println(res);
	}

	public static List<Integer> rightSideView(TreeNode root) {
		List<Integer> list=new ArrayList<>();
		Deque<TreeNode> que=new ArrayDeque<>();
		if(root==null){
			return list;
		}
		que.offer(root);
		while(!que.isEmpty()){
			int size=que.size();
			while(size>0){
				TreeNode node = que.poll();
				if(size==1){
					list.add(node.val);
				}
				if(node.left!=null){
					que.offer(node.left);
				}
				if(node.right!=null){
					que.offer(node.right);
				}
				size--;
			}
		}
		return list;
	}
}

637. 二叉树的层平均值

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

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

/**
 * @author light
 * @Description 二叉树的层平均值
 * @create 2023-08-15 18:23
 */
public class AverageOfLevelsTest {
	public static void main(String[] args) {
		Integer[] arr={3,9,20,null,null,15,7};
		BinaryTree2 tree2=new BinaryTree2(arr); //按数组方式创建二叉树
		List<Double> res=averageOfLevels(tree2.root);
		System.out.println(res);
	}
	public static List<Double> averageOfLevels(TreeNode root) {
		Deque<TreeNode> que=new ArrayDeque();
        List<Double> list=new ArrayList();
        if(root==null){
            return list;
        }
        que.add(root);
        while(!que.isEmpty()){
            int size=que.size();
            int count=size;
            Double valSum=0.0;
            while((size--!=0)){
                TreeNode node=que.peek();
                valSum+=node.val;
                if(node.left!=null){
                    que.add(node.left);
                }
                if(node.right!=null){
                    que.add(node.right);
                }
                que.remove(); 
            }
            list.add(valSum/count);
        }
        return list;
	}
}

429. N 叉树的层序遍历

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

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

 这道题按照题目创建n叉树这里我一直有问题,所以就只给出核心代码

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> res=new ArrayList<>();
		if(root==null){
			return res;
		}
		Deque<Node> que=new ArrayDeque<>();
		que.offer(root);
		while(!que.isEmpty()){
			List<Integer> list=new ArrayList<>();
			int size=que.size();
			while (size>0){
				Node node=que.poll();
				list.add(node.val);
				List<Node> children=node.children;
				if(children!=null){
					for(Node n:children){
						que.add(n);
					}
				}
				size--;
			}
			res.add(list);
		}
		return res;
    }
}

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

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

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

/**
 * @author light
 * @Description 在每个数行中找到最大值
 *
 *
 * @create 2023-08-15 20:58
 */
public class LargestValuesTest {
	public static void main(String[] args) {
		Integer[] arr={1,3,2,5,3,null,9};
		BinaryTree2 tree2=new BinaryTree2(arr); //按数组方式创建二叉树
		List<Integer> res=largestValues(tree2.root);
		System.out.println(res);
	}
	public static List<Integer> largestValues(TreeNode root) {
		List<Integer> list=new ArrayList<>();
		Deque<TreeNode> que=new ArrayDeque<>();
		if(root==null){
			return list;
		}
		que.offer(root);
		while(!que.isEmpty()){
			int size=que.size();
			int max=que.peek().val;
			while (size>0){
				TreeNode node=que.poll();
				if(node.left!=null){
					que.offer(node.left);
				}
				if(node.right!=null){
					que.offer(node.right);
				}
				max=max>node.val?max:node.val;
				size--;
			}
			list.add(max);
		}
		return list;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值