今日刷题重点—二叉树的深度
104. 二叉树的最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3
方法一:递归(后序)
递归三要素:
- 参数和返回值:参数就是树的根节点,返回值:树的深度
- 结束条件:如果为空节点NULL,就返回0,表示高度为0
- 单层递归逻辑:先求左子树的深度,再求右子树的深度,最后取左右深度的最大值,再+1(因为要算上当前的节点),返回的就是以目前节点为根节点的树的深度.
参考代码1
int maxDepth(TreeNode* root) {//参数为要判断层数的节点
if(root==NULL) { //结束条件
return 0;
}
int leftDepth = maxDepth(root->left);//每次继续递归计算左子树的深度
int rightDepth = maxDepth(root->right);//计算右子树的深度
int depth = 1 + max(leftDepth,rightDepth);//寻找最大的然后加上当前层便是到当前节点的深度.
return depth;//返回给上一层.
}
方法二:递归(先序)
使用一个变量记录每一层递归过程中树的最大深度,最后进行返回.
递归三要素:
- 参数和返回值:参数就是树的根节点 root 和 从根节点到当前节点的深度depth.
- 结束条件:当遇到叶子节点时就不需要往下递归了.
- 单层递归逻辑: 如果根节点的左子树不为空,则继续进行递归,同时传入的depth+1 . 左子树递归完毕后,进行右子树的递归…
参考代码2
//递归法:先序
int result;
void getDepth(TreeNode* node,int depth){//depth:表示到root为止,树的深度.
result = depth>result ? depth : result; //进来该函数之后先更新result;
if(node->left==NULL&&node->right==NULL){//判断左右节点是否为空
return;
}
if(node->left){
depth++;
getDepth(node->left,depth);
depth--;//进行回溯 用于下面右子树的递归判断.
}
if(node->right){
// depth++;
// getDepth(node->right,depth);
// depth--;
getDepth(node->right,depth+1);
}
return;
}
int maxDepth(TreeNode* root) {
result = 0;
if(root==NULL) {
return 0;
}
getDepth(root,1);
return result;
}
方法三—迭代法(层次遍历)
采用队列一层层的进行遍历,每次depth++.
这种方法写起来和理解起来最佳
参考代码3
//方法三:层次遍历(最好理解.)
int maxDepth(TreeNode* root) {
if(root==NULL){
return 0;
}
queue<TreeNode*> Q;
Q.push(root);
int depth = 0;
while(!Q.empty()){
int size = Q.size();
for(int i = 0;i < size;i++){
TreeNode* node = Q.front();
Q.pop();
if(node->left){
Q.push(node->left);
}
if(node->right){
Q.push(node->right);
}
}
depth++;//每遍历一层depth++
}
return depth;
}
559. N 叉树的最大深度
给定一个 N 叉树,找到其最大深度。
最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。
N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。
示例 1:
输入:root = [1,null,3,2,4,null,5,6]
输出:3
示例 2:
输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:5
思路分析:
N叉树只是 父节点上的子节点有多个,其他的和二叉树处理思路相同.
参考代码1—递归(后序)
//递归 后序..
int maxDepth(Node* root) {
if(root==NULL) {
return 0;
}
int depth,maxdepth = 0;
for(int i = 0; i < root->children.size(); i++) {
depth = maxDepth(root->children[i]);//获取到当前子节点的深度.
maxdepth = max(depth,maxdepth);//进行更新.
}
return maxdepth+1;//返回给上一层 到当前节点的深度.
}
参考代码2—递归(先序)
//递归,先序.
int result;
void getDepth(Node* node,int depth) {
result = depth > result ? depth : result;
for(int i = 0; i < node->children.size(); i++) {
if(node->children[i]) {
getDepth(node->children[i],depth+1);
}
}
return;
}
int maxDepth(Node* root) {
result = 0;
if(root==NULL) {
return 0;
}
getDepth(root,1);
return result;
}
参考代码3—迭代(层次遍历)
//迭代:层次遍历
int maxDepth(Node* root) {
if(root==NULL){
return 0;
}
queue<Node*> Q;
Q.push(root);
int depth = 0;
while(!Q.empty()){
int size = Q.size();
for(int i = 0;i < size;i++){
Node* node = Q.front();
Q.pop();
for(int j = 0;j < node->children.size();j++){
if(node->children[j]){
Q.push(node->children[j]);
}
}
}
depth++;
}
return depth;
}
111.二叉树的最小深度
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:2
示例 2:
输入:root = [2,null,3,null,4,null,5,null,6]
输出:5
方法一—递归(后序)
求最小深度时,因为是遍历到叶子节点才算一个深度.我们不可以直接在最大深度的算法上仅仅把返回值从max改成min就OK了.
如果那样的话,会出现如下: 算法求出的最小深度是1,但实际上是3
所以我们在处理时要注意节点左子树和右子树,一个为空一个不为空的特殊情况.
- 当左子树为空右子树不为空时,返回的应该是右子树深度+1;
- 当右子树为空左子树不为空时,返回的应该是左子树深度+1;
- 当左右子树都不为空时,返回的是两棵树的最小深度+1;
参考代码1
//递归
int minDepth(TreeNode* root) {
if(root==NULL) {
return 0;
}
int leftDepth = minDepth(root->left);
int rightDepth = minDepth(root->right);
if(root->left==NULL&&root->right) { //当左子树为空,右子树不为空,则深度= 右子树深度+1
return rightDepth+1;
}
if(root->right==NULL&&root->left) { //当左子树不为空,右子树为空,则深度= 左子树深度+1
return leftDepth+1;
}
return 1+min(leftDepth,rightDepth);//都不为空,则取最小的那个.
}
方法二—迭代法(层次遍历)
一遇到叶子节点就返回深度.
参考代码2
//层次遍历
int minDepth(TreeNode* root) {
if(root==NULL){
return 0;
}
queue<TreeNode*> Q;
Q.push(root);
int depth = 0;
while(!Q.empty()){
int size = Q.size();
for(int i = 0;i < size;i++){
TreeNode* node = Q.front();
Q.pop();
if(node->left){
Q.push(node->left);
}
if(node->right){
Q.push(node->right);
}
if(!node->left&&!node->right){
return depth+1;//带上当前层..
}
}
depth++;
}
return depth;
}