104.二叉树的最大深度
思路:
层序遍历,每一层深度加1,遍历完所有节点。返回深度。
看视频后:
深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)从上往下,所以用前序
高度:从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)从下往上,所以用后序
根节点的高度就是二叉树的最大深度,因此本题可以使用后序。其他节点的深度=(最大高度(根节点)-高度(该节点)+1)
高度后序遍历:
int maxDepth(TreeNode* root) {
if(root==NULL)
return 0;
int leftHeight = maxDepth(root->left);
int rightHeight = maxDepth(root->right);
int Depth=(1+max(leftHeight,rightHeight));
return Depth;
}
深度前序遍历:
先判断节点,如果节点为空则返回(边界条件)。设立变量result,每次比较节点和它的深度,记录最大值(中)。如果左节点存在,深度加1,并对左节点进行遍历,结束后回退1(左)。同样对右节点进行操作。
public:
int result=0;
void getDepth(TreeNode* node, int depth)
{
if(node==NULL)
return;
result=depth > result ? depth : result;
if(node->left)
{
depth++;
getDepth(node->left,depth);
depth--;
}
if(node->right)
{
depth++;
getDepth(node->right,depth);
depth--;
}
}
完成了559号题目。
111.二叉树的最小深度
思路:
1.层序遍历,每一层深度加1。在左节点和右节点push进queue之前,增加判断:左节点和右节点都为null,则返回深度+1;其他相同。
2. 类似上一题最大深度,但只改成min并不成功;
看视频后:
需要考虑左子树为空右子树不为空或者左子树不为空右子树为空的情况。
222.完全二叉树的节点个数
思路:
1.使用层序遍历把所有节点遍历,每遍历一个节点 sum++
2.设置public变量sum,在函数里如果root==null则返回,否则sum++,然后对左右节点进行递归。最后return sum。
看视频后:
由于是完全二叉树,要根据完全二叉树的特性做题。
在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。
因此,除了最后一层,其他都是满二叉树。满二叉树的元素个数为2^depth-1.如果以节点为对称轴,满二叉树的外围的左节点和右节点长度相等。因此我们可以判断二叉树是否为满二叉树,如果是,则为2^leftdepth-1。如果不是,右节点长度则比左节点长度小1,元素个数为2^rightdepth-1.
最后再合并左右子树的个数加节点1.
int compare(TreeNode *Node)
{
int leftDepth=1;
int rightDepth=1;
TreeNode* tempNode=Node;
while(Node->left!=NULL)
{
Node=Node->left;
leftDepth++;
}
Node=tempNode;
while(Node->right!=NULL)
{
Node=Node->right;
rightDepth++;
}
if(leftDepth==rightDepth)
return 2^leftDepth-1;
return 2^rightDepth-1;
}
int countNodes(TreeNode* root) {
if(root==NULL)
return 0;
int leftCount=countNodes(root->left);
int rightCount=countNodes(root->right);
int count=leftCount+rightCount+1;
return count;
}