1、计算二叉树节点个数
利用子问题思路解决:
如果只有一个节点,左右结点为空,那么返回的节点数就是 左节点数 加 右节点数 +1
如果是多个节点,分解为子问题来看:
1.判断根节点是否为空,如果不为空,,计算它左、右子树的节点数,总节点数=左子树节点数 + 右子树结点数+ 它自己本身“1”。
2.它的左右子树又分成子问题,分别计算他们各自左右子树的节点数。
//计算二叉树结点个数
int TreeSize(BTNode* root)
{
return root == NULL ? 0 : TreeSize(root->left)
+ TreeSize(root->right) + 1;
}
举个:以下为方便理解它的递归展开图
2、计算二叉树叶子节点个数
叶子节点:左右孩子都为空的节点叫叶子节点。
解决方法:利用子问题思想解决。计算整个树的叶子节点可有划分为–——-它的左右两个子树叶子节点的总合。他的左右子树可以继续往下划分。
- 如果根节点为空,那么返回0;
- 如果根节点的左右节点为NULL,说明这个节点就是一个叶子,返回1。
先分解为子问题,如果是一个节点:
如果是多个节点: - 1、如果根节点为空,那么返回0;
- 2、如果根节点的左右节点为NULL,说明这个节点就是一个叶子,返回1。
- 如果根节点不为空,左右节点也不为空,那它就不是叶子,继续遍历他的左右子树,找叶子节点。
//计算叶子节点个数
int TreeleafSize(BTNode* root)
{
if (root == NULL)
return 0;
if (root->left == NULL && root->right == NULL)
return 1;
//如果左右节点不为NULL,遍历它左右节点的左右子树
return TreeleafSize(root->left) + TreeleafSize(root->right);
}
举个
为方便进一步理解,递归展开图
3、求二叉树高度
依旧和以上方法相同,子问题思路解决。如果化成都是求一个结点的高度,那就方便了。计算整个树的高度,如果根节点不为空,那么,其实就是计算,它左右子树的高度(取大的那一个)+自己本身高度1.
举个
//求二叉树的高度(深度)
//子问题求解
int TreeHeiht(BTNode* root)
{
if (root == NULL)
return 0;
int Lh = TreeHeiht(root->left);
int Rh = TreeHeiht(root->right);
//要左右子树高的那个作为树的高度
return Lh > Rh ? Lh+1 : Rh+1;
}
4、求二叉树K层结点个数
子问题思路解决。k表示层数
当只有一个节点时,它只有一层,一层的节点数就是1.
当求第两层的节点数,k=2,判断根节点的左右节点是否都存在,此时,把左右节点作为左右子树的根,判断根是否存在,k-1,把第一层的左右节点,看作他们所在子树的第一层。也就是化解成了,求第一层节点的问题。
//求第k层的节点数
int TreeLevel(BTNode* root, int k)
{
//根节点为空,该层没有节点
if (root == NULL)
return 0;
//root不为空,且是第一层,那么就一个节点
if (k