赞
踩
题目:
给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
解题思路:
树的遍历方式总体分为两类:深度优先搜索(DFS)、广度优先搜索(BFS)。
常见 DFS : 先序遍历、中序遍历、后序遍历。
常见 BFS : 层序遍历(即按层遍历)。
求树的深度需要遍历树的所有节点,本文将介绍基于 后序遍历(DFS) 和 层序遍历(BFS) 的两种解法。
C++:
1、后序遍历(DFS)
关键点: 此树的深度和其左(右)子树的深度之间的关系。显然,此树的深度 等于 左子树的深度 与 右子树的深度中的 最大值 +1。
算法解析:
#include<iostream>
#include<algorithm>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode()
{
int x = 0;
}
TreeNode(int x)
{
val = x;
left = right = nullptr;
}
TreeNode(int x, TreeNode *left, TreeNode *right)
{
val = x;
left = left;
right = right;
}
};
// 后序遍历
// 关键点:树的深度 == 左子树的深度 与 右子树的深度中的 最大值 +1
class Solution
{
public:
int maxDepth(TreeNode* root)
{
if (root == nullptr) return 0;
return max(maxDepth(root->left), maxDepth(root->right)) + 1;
}
};
2、层序遍历(BFS)
关键点: 每遍历一层,则计数器 +1+1+1 ,直到遍历完成,则可得到树的深度。
算法解析:
#include<iostream>
#include<algorithm>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode()
{
int x = 0;
}
TreeNode(int x)
{
val = x;
left = right = nullptr;
}
TreeNode(int x, TreeNode *left, TreeNode *right)
{
val = x;
left = left;
right = right;
}
};
// 层序遍历
//关键点: 每遍历一层,则计数器 + 1 ,直到遍历完成,则可得到树的深度。
#include<vector>
class Solution1
{
public:
int maxDepth(TreeNode* root)
{
if (root == nullptr) return 0;
vector<TreeNode*> que; // 容器:用于存储下一层的节点,类型为链表中的节点,故为<TreeNode*>
que.push_back(root);
int res = 0;
while (! que.empty()) // 队列que为空时跳出
{
vector<TreeNode*>tmp; // 临时列表,用于存储当前层的打印结果
for (TreeNode* node : que)
{
// 添加下一层的子节点至tmp,用于下一步计算
if (node->left != nullptr) tmp.push_back(node->left);
if (node->right != nullptr) tmp.push_back(node->right);
}
que = tmp;
res++;
}
return res;
}
};
python:
1、后序遍历/深度优先(DFS)
思路同上:
class TreeNode:
def __init__(self,val = 0,left=None,right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def maxDepth(self,root):
if not root: return 0
return max(self.maxDepth(root.left),self.maxDepth(root.right)) + 1
2、层序遍历/广度优先(BFS)
class TreeNode:
def __init__(self,val = 0,left=None,right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def maxDepth(self,root):
if not root: return 0
queue, res = [root], 0
while queue:
tmp=[]
for node in queue:
if node.left: tmp.append(node.left)
if node.right: tmp.append(node.right)
queue = tmp
res += 1
return res
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。