题目:
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
思路
- 最大深度,其实也可以理解为最大高度, 如何判断树高呢?
- 我知道我子节点的高度之后,+1就是我的高度 (已经确定了遍历顺序为后续遍历)
- 那么这就是我的最小问题了
- 继续分解问题,我怎么知道我的子节点高度呢,两个节点中选最大的不就是我的最大高度吗
-继而我知道了我的最小问题题解
Math.max(node.left.height,node.right.height)+1
代码实现
public int getHigh(TreeNode node) {
if(node == null) return 0;
int leftHigh = getHigh(node.left);
int rightHigh = getHigh(node.right);
return Math.max(leftHigh,rightHigh)+1;
}
题目
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
思路
- 首先要明白什么是最小深度最小深度是 从根节点到最近叶子节点的最短路径,关键的一点是叶子节点
- 依然是我知道了每个叶子节点到根节点的深度(依然后序遍历)
- 然后根据最小深度的规则筛选,即是我们要的结果
- 最小问题为 最小深度的的筛选规则
- 左节点存在,右节点不存在,则左节点为叶子节点,left.height +1
- 右节点存在,左节点不存在,则右节点为叶子节点,right.height +1
- 左右节点都不存在,Math.min(left.height ,right.height)+1
代码实现
public int getMinDepth(TreeNode node) {
if(node == null) return 0;
int leftDepth = getMinDepth(node.left);
int rightDepth = getMinDepth(node.right);
if(node.left!=null && node.right == null){
return leftDepth+1;
}else if(node.left==null && node.right!=null){
return rightDepth+1;
}else {
return Math.min(leftDepth, rightDepth)+1;
}
}
题目
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
思路
1 . 如果不考虑完全二叉树,此题解法,遍历每个节点,然后左右节点个数相加,在加根节点,就是我们要求的结果,采用后序遍历
解法如下:
public int getTreeNodeNumber_1(TreeNode node) {
if(node == null) return 0;
//左节点个数
int leftNumber = getTreeNodeNumber_1(node.left);
//右节点个数
int rightNumber = getTreeNodeNumber_1(node.right);
//左右中累加
return leftNumber + rightNumber+1;
}
- 完全二叉树计算节点个数有个公式:可以直接用 2^树深度 - 1 来计算,其实是希望我们能利用完全二叉树的特点来计算,完全二叉树有如下特点
子节点,左右两边的个相等的一定是完全二叉树,如图2
假设我们有:
- 两个左右两个指针 leftNode; rightNode;
- 两个计数器:leftNum; rightNum;
- 记录个数是不是很简单,指针不为null,计数器就累加
- 然后判断 leftNum; rightNum ,如果相等 就根据
TreeNode leftNode = node.left;
TreeNode rightNode= node.right;
int leftDepth = 0;
int rightDepth = 0;
while(leftNode!=null){
leftNode= node.left.left;
leftDepth++;
}
while(rightNode!=null){
rightNode= node.right.right;
rightDepth++;
}
if(leftDepth == rightDepth){
return (2<<leftDepth)-1;
}
代码实现
/**
* 两个终止条件:node == null,就遍历所有节点
* 如果是左右两边相等的,就利用公式计算个数
* @param node
* @return
*/
public int getTreeNodeNumber_2(TreeNode node){
if(node == null) return 0;
TreeNode leftNode = node.left;
TreeNode rightNode= node.right;
int leftDepth = 0;
int rightDepth = 0;
while(leftNode!=null){
leftNode= node.left.left;
leftDepth++;
}
while(rightNode!=null){
rightNode= node.right.right;
rightDepth++;
}
if(leftDepth == rightDepth){
return (2<<leftDepth)-1;
}
int leftNumber = getTreeNodeNumber_2(node.left);
int rightNumber = getTreeNodeNumber_2(node.right);
return leftNumber + rightNumber+1;
}