二叉树的结构
二叉树是比较常见的一种的一种数据结构。
首先看看二叉树的数据结构:
//由左节点和右节点以及一个节点值构成
public class TreeNode{ TreeNode leftNode; TreeNode rightNode; int val; TreeNode(int val){ this.val=val; this.leftNode=null; this.rightNode=null; } }
正是由于二叉树的这个结构,所以我们常用遍历解决二叉树的相关问题。
二叉树的深度问题
二叉树的深度问题主要分为两种,最大深度和最小深度。
最大深度:即二叉树的高度
递归思路:递归跳出条件是判断一个节点是否是空,如果为空则跳出,如果不为空则加一继续递归。最后的返回值只需返回左子树和右子树中的最大值。
代码实现:
public int deepthTree(TreeNode node){ if (node==null){ return 0; //递归跳出条件 } return Math.max(deepthTree(node.leftNode),deepthTree(node.rightNode))+1; }
非递归思路:采用二叉树的层序遍历的思想(层序遍历为我们可以采用队列进行辅助操作)。我们需要遍历每层,每遍历完一层则将level进行加一的操作。这个问题的关键在于如何知道每层是否遍历完了,我们可以定义一个初始变量cur,然后将cur和每层的进入队列的节点的size进行比较,判断是否遍历完这个层的最后一个节点。
代码实现:
public int deepthTree(TreeNode node){ //非递归实现 LinkedList<TreeNode> queue=new LinkedList<>(); //设置队列 queue.offer(node); //将根节点入队列 TreeNode bitTree=null; int level=0; while (!queue.isEmpty()){ int cur=0; //当每层遍历完的时候,cur恢复初始值 int length=queue.size(); while (cur<length){ bitTree=queue.poll(); cur++; if (bitTree.leftNode!=null) { queue.offer(bitTree.leftNode); } if (bitTree.rightNode!=null) { queue.offer(bitTree.rightNode); } } level++; //层数进行++ } return level; }
最小深度
参考别人整理的思路:
思路:
1.没有根节点,那结果就是0
2.有根节点,没有左右子树,结果为1
3.没有左子树,有右子树。把右子树看成一棵新的树。
4.没有右子树,有左子树。把左子树看成一棵新的树。
5.既有左子树,又有右子树。那就把左右子树分别都看成新的树,最后比较谁的最近叶子的路径短,就取哪边。
---------------------
原文:https://blog.csdn.net/sinat_35803474/article/details/70040544
代码实现:
public int deepthTree(TreeNode node){ //<--最小深度--> if (node==null){ return 0; } if (node.leftNode==null && node.rightNode==null){ return 1; } if (node.rightNode==null){ return deepthTree(node.leftNode)+1; }else if (node.leftNode==null){ return deepthTree(node.rightNode)+1; }else { return Math.min(deepthTree(node.leftNode),deepthTree(node.rightNode))+1; } }