
二叉树的深度
题目:输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
例如:
给定二叉树 [3,9,20,null,null,15,7],

返回它的最大深度 3 。
解法一(递归实现)
根节点加上左右子树的最大深度就是树的最大深度。
代码展示
代码如下:
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root==NULL)
return 0;
int left_depth=maxDepth(root->left);
int right_depth=maxDepth(root->right);
return max(left_depth,right_depth)+1;
}
};
解法二(层次遍历)
遍历完每一层让深度加一
代码展示
代码如下:
class Solution {
public:
int maxDepth(TreeNode* root) {
queue<TreeNode*> q;
if(root==NULL) return 0;
q.push(root);
int depth=0;
while(!q.empty())
{
//这里不能直接用q.size(),要定义size,因为q.size()一直在变
int size=q.size();
depth++;
for(int i=0;i<size;i++)
{
TreeNode *t=q.front();
q.pop();
if(t->left!=NULL) q.push(t->left);
if(t->right!=NULL) q.push(t->right);
}
}
return depth;
}
};
二叉树最大宽度
题目:给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。
每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。
示例 1:

示例 2:

示例 3:

示例 4:

注意: 答案在32位有符号整数的表示范围内。
解题思路
这题又是层次遍历的一个演变。我们将节点和序列号成对放入队列之中,然后遍历完每一层就将这层最后一个序号-最前一个序号+1,最后得出最大值就是二叉树的最大宽度。
代码展示
代码如下:
class Solution {
public:
int widthOfBinaryTree(TreeNode* root) {
if(root==NULL) return 0;
queue<pair<TreeNode*,unsigned long long>> q;//这里一定要是unsigned long long,不然会溢出
q.push({root,1});
int my_max=1;
while(!q.empty())
{
int size=q.size();
//每一层的最后一个序号-最前一个序号+1
my_max=max(my_max,int(q.back().second-q.front().second+1));
for(int i=0;i<size;i++)
{
TreeNode* t=q.front().first;
unsigned long long pos=q.front().second;//这里一定要是unsigned long long,不然会溢出
q.pop();
if(t->left) q.push({t->left,2*pos});
if(t->right) q.push({t->right,2*pos+1});
}
}
return my_max;
}
};
本文介绍两种二叉树的计算方法:一种是通过递归或层次遍历来计算二叉树的最大深度;另一种是使用层次遍历算法的演变来获取二叉树的最大宽度。
311

被折叠的 条评论
为什么被折叠?



