1.二叉树最大深度
深度 是 节点 到 节点头的距离 从头 到 底 计数
高度 是 节点 到 叶子节点 的距离 从 底 到 顶 计数
class Solution {
public:
int a ( int x , int y ) {
return x >=y ? x : y;
}
int getheight ( TreeNode * cur ) {
if ( cur == nullptr ) return 0;
int rightnum = getheight( cur -> right );
int legtnum = getheight( cur -> left );
int num = a( rightnum ,legtnum ) + 1;
return num;
}
int maxDepth(TreeNode* root) {
int num = getheight( root );
return num;
}
};
a 函数 相当于 max 函数 ,想试试三目运算 就自己写l
2.二叉树最小深度 leetcode
class Solution {
public:
int getminheight ( TreeNode * cur ) {
if ( cur == NULL ) return 0;
int leftnum = getminheight ( cur -> left );
int rightnum = getminheight( cur -> right );
if ( cur -> left == NULL && cur -> right != NULL ) return 1 + rightnum;
if ( cur -> left != NULL && cur -> right == NULL ) return 1 + leftnum;
int num = min( leftnum,rightnum) + 1;
return num;
}
int minDepth(TreeNode* root) {
return getminheight(root);
}
};
与最大深度 不同
max 变为 min
注意左子树为空,右子树 不为空的情况
3.完全二叉树节点个数 leetcode
满二叉树 是 所有 节点 都是左右孩子,除了叶子节点
完全二叉树 是 除了叶子节点 不全是 满的 其他都是满二叉树 , 且 叶子节点 排列 是连续 的不能 有 空
可以直接遍历 记录个数
这里使用完全二叉树的性质 满二叉树 的节点个数 2的k次方 - 1
class Solution {
public:
int countNodes(TreeNode* root) {
if ( root == NULL ) return 0;
TreeNode* left = root -> left;
TreeNode* right = root -> right;
int leftnum,rightnum = 0;
while ( left ) {
left = left -> left;
leftnum++;
}
while ( right ) {
right = right -> right ;
rightnum++;
}
if ( rightnum == leftnum ) return (2<<rightnum) - 1;
int lenum = countNodes(root -> left);
int rinum = countNodes( root -> right );
int num = lenum + rinum + 1;
return num;
}
};
2 << rightnum 相当于 2 的 rightnum 次方
当一个 节点 的 右边 孩子的数量 和 左边孩子数量 相同时 , 表示 当前节点的 下面 是 满二叉树 可以用公式 算出 节点个数