二叉树(8)----求二叉树第K层的节点数和二叉树第K层的叶子节点数,递归方式

1、二叉树定义

typedef struct BTreeNodeElement_t_ {
    void *data;
} BTreeNodeElement_t;

typedef struct BTreeNode_t_ {
    BTreeNodeElement_t *m_pElemt;
    struct BTreeNode_t_    *m_pLeft;
    struct BTreeNode_t_    *m_pRight;
} BTreeNode_t;

2、求二叉树第K层的节点数

(1)递归方式

给定根节点pRoot:

如果pRoot为空,或者层数KthLevel <= 0,则为空树或者不合要求,则返回0;

如果pRoot不为空,且此时层数KthLevel==1,则此时pRoot为第K层节点之一,则返回1;

如果pRoot不为空,且此时层数KthLevel > 1,则此时需要求pRoot左子树(KthLevel - 1 )层节点数和pRoot右子树(KthLevel-1)层节点数;

int  GetBTreeKthLevelNodesTotal( BTreeNode_t *pRoot, int KthLevel){
    if( pRoot == NULL || KthLevel <= 0 )
        return 0;
    if( pRoot != NULL && KthLevel == 1 )
        return 1;

    return (GetBTreeKthLevelNodesTotal( pRoot->m_pLeft, KthLevel-1) + GetBTreeKthLevelNodesTotal( pRoot->m_pRight, KthLevel - 1 ) );
}

3、求二叉树第K层叶子节点数

(1)递归方式

给定节点pRoot:

如果pRoot为空,或者层数KthLevel <= 0, 则为空树或者是层数非法,则返回0;

如果pRoot不为空,且此时层数KthLevel==1时,需要判断是否为叶子节点:

如果pRoot左右子树均为空,则pRoot为第K层叶子节点之一,则返回1;

如果pRoot左右子树之一存在,则pRoot不是叶子节点,则返回0;

如果pRoot不为空,且此时层数KthLevel > 1,需要返回 KthLevel-1层的左子树和右子树结点数。

int GetBTreeKthLevelLeafNodesTotal( BTreeNode_t *pRoot, int KthLevel){
    if( pRoot == NULL || KthLevel <= 0 )
        return 0;

    if( pRoot != NULL && KthLevel == 1 ){
        if( pRoot->m_pLeft == NULL && pRoot->m_pRight == NULL )
            return 1;
        else
            return 0;
    }

    return ( GetBTreeKthLevelLeafNodesTotal(  pRoot->m_pLeft,  KthLevel - 1) + GetBTreeKthLevelLeafNodesTotal( pRoot->m_pRight, KthLevel -1) );
}
时间: 2024-10-02 03:03:06

二叉树(8)----求二叉树第K层的节点数和二叉树第K层的叶子节点数,递归方式的相关文章

Java二叉树的递归,非递归遍历,高度,节点数,叶子节点数

import java.util.LinkedList; import java.util.Queue; import java.util.Stack; public class Main { public static class TreeNode<T>{ T data; TreeNode<T> left=null; TreeNode<T> right=null; public TreeNode() {} public TreeNode(T data){ this.d

递归遍历 二叉树 求高度 和 节点数 和 叶子节点数

#include <iostream> #include <cstdio> #include<algorithm> #include<cstdlib> using namespace std; struct Node { char data; Node *lchild; Node *rchild; }; int nodes(Node *T) { if(T==NULL) return 0; else if(T->lchild==NULL&&

六:二叉树中第k层节点个数与二叉树叶子节点个数

二叉树中第k层节点个数 递归解法: (1)如果二叉树为空或者k<1返回0 (2)如果二叉树不为空并且k==1,返回1 (3)如果二叉树不为空且k>1,返回左子树中k-1层的节点个数与右子树k-1层节点个数之和 代码如下: int GetNodeNumKthLevel(BinaryTreeNode *pRoot, int k) { if(pRoot == NULL || k < 1) return 0; if(k == 1) return 1; int numLeft = GetNodeN

数和二叉树(第七章)

树的基本概念 树的定义 数是有n个节点组成的有限集合(记为T).其中 如果n=0,它是一颗空树,这是树的特例 如果n>0,这n个节点中存在(且仅存在)一个节点作为树的根节点,简称为根:其余节点可分为m(m>=0)个互不交集的有限集T1,T2,Tn,其中每个子集本身又是一颗符合本定义的树,称为根的子树 树的定义是递归的 树是一种非线性结构. 树的逻辑表示方法 树形表示法 文氏图表示方法 凹入表示法 括号表示法 树的基本术语 节点的度与树的度:树中某个节点的子树的个数称为该节点的度.树中各节点的度

【数据结构】二叉树的实现(如:默认成员函数、(叶子)节点数、深度、四种遍历)

二叉树:树的每个节点最多有两个子节点. 我们看下它的结构,有二叉链表结构与三叉链表结构,具体结果如我摘自<C++Primer>中的图. 相比之下,三叉链表的优势在于当我们知道父亲节点要找他的子女节点比较方便和便捷,反之当我们知道子女节点找它的父亲节点时也方便. 下面,我实现下二叉链表的结构. template <class T> struct BinaryTreeNode {     BinaryTreeNode<T>* _left;    //左子树     Bina

二叉树基本操作续一:二叉树建立、节点数统计

在上一篇:二叉树基本操作 中,我们描述了二叉树的递归遍历函数.在这里主要是给出这些函数的测试代码,为了测试更加方便,我们实现了三个新的函数:建立二叉树.统计二叉树叶子节点数量.统计二叉树总节点数量.(二叉树的定义用上篇文章中的定义) 二叉树建立: 1 tree_pointer create_bin_tree() 2 { 3 tree_pointer node; 4 int x; 5 scanf("%d", &x); 6 if (x == 0) { 7 node = NULL;

求二叉树第K层的节点个数+求二叉树叶子节点的个数

size_t _FindLeafSize(Node* root)     //求二叉树叶子节点的个数    {        //static size_t count = 0;        if (root == NULL)            return 0; if (root->_left == NULL&&root->_right == NULL);        return 1; return _FindLeafSize(root->_right) +

C++算法之 求二叉树第k层的节点的个树

思路: 如果树为空或者k< 1,那么节点个数为0: 如果k=1,那么节点个数为1: 如果k>1,那么第k层 总节点的个数等于 左子树k-1层的节点个数+右子树k-1层节点的个数+1 代码如下: // BTNumOfKLevel.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; class BTree { public: int m_nValue

二叉树(5)----求二叉树节点数,递归与非递归

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.求二叉树节点数 对任意一个给定子树的节点数,左子树节点数+右子树节