二叉树最宽的那层从左往右第二个结点
思想:前两天面试拼多多Java岗位,手写算法的时候,面试官问了这道题,由于当时比较紧张,另外是用word写的,没有找到感觉。勉强写出来了一半,现在来好好总结一下。首先这题是根据求二叉树宽度延伸而来的,其实大部分关于二叉树的算法题都是由基本的遍历,求深度,宽度,根到节点的路径等等演变而来的。只要把基本的掌握好,其他的算法都是在此基础上进行延伸。废话少说,先来分析一下:首先我们需要找到最宽的那层,当然这需要层序遍历。因为只有当我们把二叉树遍历完后才能知道哪一层是最宽的,所以我们在遍历每一层结点的时候需要临时保存当前层的第二个结点。当这层遍历完后,如果当前层的结点数大于最大数目,那么就把当前层的结点数赋值给最大数目,另外把当前层的第二个结点赋值给最终输出的结点。
public static TreeNode levelPrint(TreeNode root) { if (root == null) return null; LinkedList<TreeNode> list = new LinkedList<>(); list.addLast(root); int maxSize = 1; // 每层节点数的最大值 TreeNode secondNode = null; //最终要返回的节点 int count = 1; //每一层的结点数 while (!list.isEmpty()) { int num = 0; //临时保存下一层的结点数目 TreeNode p = null; //临时保存下一层的第2个结点 //从根(第一层)开始遍历,一次for循环把当前层的结点全部remove,并把他们的孩子结点保存到List中。 for(int i = 0; i < count; i++) { TreeNode node = list.removeFirst(); if (node.left != null) { list.addLast(node.left); //如果num==2,说明刚刚保存在List集合中的节点肯定是下一层的第2个节点 if(++num == 2) p = node.left; } if (node.right != null) { list.addLast(node.right); //和上面同理,之所以这两个if都加num==2的判断,因为当前节点的孩子结点数是不确定的。 if(++num == 2) p = node.right; } } count = num; if(maxSize < count) { maxSize = count; secondNode = p; } } return secondNode; }