广度优先搜索题记

tech2022-11-29  108

101 对称二叉树

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

1 / \ 2 2 / \ / \ 3 4 4 3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

1 / \ 2 2 \ \ 3 3

解题:本题在于判断左右节点的是否相等,判断子树是否相当.使用队列实现,每次出队或入队左右两个,进行两两比较. 第一层时,节点的左节点和右节点比较 第二层时,左节点的左子节点和右节点和右子节点的进行比较 只要使即将比较的节点相邻进入就行,代码如下

public boolean isSymmetric(TreeNode root) { //每次取出两个节点进行比较,比较相关的节点 if (root==null) return true; if (root.right==null&&root.left==null) return true; Queue<TreeNode> queue=new LinkedList<>(); queue.offer(root.left); queue.offer(root.right); //按照这个顺序出栈和进栈 while (!queue.isEmpty()){ //先拿出两个节点 ,,比较两个节点 TreeNode left=queue.remove(); TreeNode right=queue.remove(); //其中为空则返回,不然就行继续 if(left==null&&right==null){ continue; } if(left==null||right==null){ System.out.println("值为空"); return false; } // 比较两个子树的值 if (left.val!=right.val){ return false; } queue.offer(left.left); queue.offer(right.right); queue.offer(left.right); queue.offer(right.left); } return true; }

107. 二叉树的层次遍历 II

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

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

3 / \ 9 20 / \ 15 7

题目返回的是List<List> ,所以可以使用LinkedList的类,可以使用从头插入节点,这样就不用先后排序了,使用队列来解决,入队第一个节点,在不为空的情况下,建立一个list集合存储子节点,根据当前队列的长度进行循环,判断当前一层有多少个,如果有两个,表明是左右节点. 出队节点,如果当前节点有子树,则添加入队列里

public List<List<Integer>> levelOrderBottom(TreeNode root) { LinkedList<List<Integer>> result = new LinkedList<>(); if (root == null) return result; Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); while (!queue.isEmpty()) { List<Integer> list= new ArrayList<>(); // 每次都取出一层的所有数据 int count = queue.size(); for (int i = 0; i < count; i++) { TreeNode treeNode= queue.poll(); list.add(treeNode.val); if (treeNode.left != null) queue.add(treeNode.left); if (treeNode.right != null) queue.add(treeNode.right); } // 每次都往队头塞 result.addFirst(list); } return result; }
最新回复(0)