精华内容
下载资源
问答
  • 计算二叉树的叶子结点个数

    万次阅读 2018-07-23 21:26:51
    #include "string.h"  #include "stdio.h"  #include "... /*结点的数据域*/  struct BiTNode *lchild , *rchild; /*指向左孩子和右孩子*/ } BiTNode , *BiTree; void CreatB...

    #include "string.h" 
    #include "stdio.h" 
    #include "malloc.h"

    typedef struct BiTNode{
        char data;   /*结点的数据域*/
        struct BiTNode *lchild , *rchild;  /*指向左孩子和右孩子*/
    } BiTNode , *BiTree;

    void CreatBiTree(BiTree *T){
        char c;
        scanf("%c",&c);
        if(c == ' ') *T = NULL;
        else{
           *T = (BiTNode * )malloc(sizeof(BiTNode));  /*创建根结点*/
            (*T)->data = c;    /*向根结点中输入数据*/
            CreatBiTree(&((*T)->lchild));  /*递归地创建左子树*/
            CreatBiTree(&((*T)->rchild));  /*递归地创建右子树*/
        }
    }

    void getLeavesConut (BiTree T,int *count){
        if(T!=NULL && T->lchild==NULL && T->rchild==NULL){   /*访问到叶结点*/
            *count = *count + 1;
        }
        if(T){
            getLeavesConut (T->lchild,count);  /*先序遍历T的左子树*/
            getLeavesConut (T->rchild,count);  /*先序遍历T的右子数*/
        }
    }

    int getBiTreeLeavesCount(BiTree T) {
        int count = 0;                /*在主调函数中定义变量count,初始值为0*/
        getLeavesConut(T, &count);    /*调用递归函数getLeavesConut计算叶子结点个数*/
        return count;                /*返回叶子结点个数*/
    }

    main()
    {
       BiTree T = NULL;                /*初始化T */
       int count = 0;
       printf("Input some characters to create a binary tree \n");
       CreatBiTree(&T);                /*创建一棵二叉树*/
       getLeavesConut (T,&count);    /*计算二叉树中叶子结点的个数 */
       printf("The number of leaves of BTree are %d\n",count);
       getchar();
       getchar();
    }

    展开全文
  • 树与二叉树——二叉树中计算叶子结点个数问题

    千次阅读 多人点赞 2019-04-13 18:57:42
    从第层开始计算每层的节点个数:1,2,4,8,16,32,64,128,256,512,1024... 将前9层的结点数量全部加起来有511个,如果加上第十层1024,则超过967,所以该完全二叉树肯定是有十层的,所以叶子结点分布在第9层和第10...

    1、已知完全二叉树具有967个结点,则其叶子结点个数为:

    详解:

    首先明确一点该二叉树是一棵二叉树,那可以使用二叉树的一些性质。

    从第一层开始计算每层的节点个数:1,2,4,8,16,32,64,128,256,512,1024...

    将前9层的结点数量全部加起来有511个,如果加上第十层1024,则超过967,所以该完全二叉树肯定是有十层的,所以叶子结点分布在第9层和第10层,且第10层全部都是叶子结点。

    设第9层的叶子个数为b,第9层的分支结点个数为a;

    由于是完全二叉树,又该树有10层,所以第9层肯定有2^(9-1) = 256个结点,则有关系式:

    a + b = 256    ---------------(1)

    又第9层的分支结点个数为a,那么第10层的叶子个数为2*a, 或者2*a-1 个,对于这两种情况,可以根据总的结点个数来确定,因为967是一个奇数,又第1层根节点只有一个,总的结点个数减去1,则为966,是一个偶数,所以第10层的叶子个数肯定为2*a个。

    已知前9层共有1+2+4+8+16+32+64+128+256 = 511个结点,第10层有2*a个结点,所以结点总数为前9层的总数加上第10层的个数,则有关系式:

    2*a + 511 = 967  ---------------(2)

    结合关系式(1)(2),可解得a = 228, b = 28,

    叶子结点总数为第9层的叶子数加上第10层的叶子数:b + 2*a = 28 + 2 * 228 = 484。

     

     

    2、在一棵度为4的树T中,如有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则树T中的叶子结点个数为:

    解:设结点总数为n,叶子结点个数为m。

    则结点总数: n = 20 + 10 + 1 + 10 + m        ---------------(1)

    还有一个关系式是关于结点总数和总度数的。

    假如将“度”理解为一根绳子,对于每一棵树,我们都很清楚,每一个结点都是由一个度牵引着的,除了根节点这个特殊结点没有被度牵引。所以,总结点数是总的度数加上根节点的数目,而根节点只有一个,所以总结点数 = 总的度数 + 1,由此,可以得到下面的结点总数和度总数的关系式:

    n = 20*4 + 10*3 + 1*2 + 10*1 + m*0  + 1      ---------------(2)

    联合关系式(1)(2),可解得m = 82。

     

    3、一棵度为3的树中,有3度结点100个,有2度结点200个,则叶子结点个数为:

    解:虽然这棵树不是二叉树,但是有些性质也是适用的。其中,最重要的一个性质是结点总数和总度数的关系。

    设1度结点共有a个,叶子结点共有b个,总的结点个数为n,则有以下关系式:

    n = 100 + 200 + a + b

    n = 3 * 100 + 2 * 200 + 1 * a + 0 * b + 1

    联合以上两个关系式可以解得 b = 401,即叶子个数为401个。

     

    总结:

    大部分关于二叉树的计算问题,只要仅仅抓住二叉树和树的性质,基本上都能很快解决。

    所以对于二叉树的性质要非常熟悉,不仅仅要知道性质的内容,也要知道性质的推倒过程。

    展开全文
  • 二叉树叶子结点,非叶子节点以及深度的计算

    千次阅读 多人点赞 2018-12-30 12:34:36
    二叉树叶子结点计算 //统计叶子结点的数目 int LeafNum(BiTree T) { if (!T) { return 0; } else if (!T->lchild && !T->rchild) { return 1; } else { return LeafNum(T-...

    二叉树叶子结点的计算

    //统计叶子结点的数目
    int LeafNum(BiTree T) {
    	if (!T) {
    		return 0;
    	} else if (!T->lchild && !T->rchild) {
    		return 1;
    	} else {
    		return LeafNum(T->lchild) + LeafNum(T->rchild);
    	}
    }
    
    

    二叉树非叶子节点的计算

    //统计非叶子结点的数目
    int NotLeafNum(BiTree T) {
    	if (!T) {
    		return 0;
    	} else if (!T->lchild && !T->rchild) {
    		return 0;
    	} else {
    		return NotLeafNum(T->lchild) + NotLeafNum(T->rchild) + 1;
    	}
    }
    
    

    二叉树深度的计算

    //计算二叉树的深度
    int BiTreeDeepth(BiTree T) {
    	if (!T) {
    		return 0;
    	}
    	return BiTreeDeepth(T->lchild) > BiTreeDeepth(T->rchild) ?
    		1 + BiTreeDeepth(T->lchild) : 1 + BiTreeDeepth(T->rchild);
    }
    
    

    测试

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <windows.h>
    //定义一个二叉树
    typedef struct Node {
    	char data;
    	struct Node* lchild;
    	struct Node* rchild;
    }BitNode, *BiTree;
    //创建二叉树
    void CreateBiTree(BiTree* T) {
    	char ch = 0;
    	scanf("%c", &ch);
    	if (ch == ' ') {
    		*T = NULL;
    	} else {
    		*T = (BiTree)malloc(sizeof(BitNode));
    		if (!(*T)) {
    			exit(-1);
    		}
    		(*T)->data = ch;
    		CreateBiTree(&((*T)->lchild));
    		CreateBiTree(&((*T)->rchild));
    	}
    }
    //遍历二叉树
    void PreOrderTraverse(BiTree T) {
    	if (T) {
    		printf("%2c", T->data);
    		PreOrderTraverse(T->lchild);
    		PreOrderTraverse(T->rchild);
    	}
    }
    void Destroy(BiTree* T) {
    	if (*T) {
    		if ((*T)->lchild) {
    			Destroy(&((*T)->lchild));
    		}
    		if ((*T)->rchild) {
    			Destroy(&((*T)->rchild));
    		}
    		free(*T);
    		*T = NULL;
    	}
    }
    //统计叶子结点的数目
    int LeafNum(BiTree T) {
    	if (!T) {
    		return 0;
    	} else if (!T->lchild && !T->rchild) {
    		return 1;
    	} else {
    		return LeafNum(T->lchild) + LeafNum(T->rchild);
    	}
    }
    //统计非叶子结点的数目
    int NotLeafNum(BiTree T) {
    	if (!T) {
    		return 0;
    	} else if (!T->lchild && !T->rchild) {
    		return 0;
    	} else {
    		return NotLeafNum(T->lchild) + NotLeafNum(T->rchild) + 1;
    	}
    }
    //计算二叉树的深度
    int BiTreeDeepth(BiTree T) {
    	if (!T) {
    		return 0;
    	}
    	return BiTreeDeepth(T->lchild) > BiTreeDeepth(T->rchild) ?
    		1 + BiTreeDeepth(T->lchild) : 1 + BiTreeDeepth(T->rchild);
    }
    int main() {
    	BiTree t1;
    	CreateBiTree(&t1);
    	printf("**********************\n");
    	PreOrderTraverse(t1);
    	printf("\n**********************\n");
    	printf("叶子结点的数目: %d\n", LeafNum(t1));
    	printf("************************\n");
    	printf("非叶子结点的数目: %d\n", NotLeafNum(t1));
    	printf("************************\n");
    	printf("深度: %d\n", BiTreeDeepth(t1));
    	printf("************************\n");
    	Destroy(&t1);
    	if (!t1) {
    		printf("OK\n");
    	}
    	system("pause");
    	return 0;
    }
    

    效果图

    在这里插入图片描述

    希望本篇文章能对大家有所帮助, 真诚希望得到大家的评论和建议

    展开全文
  • 递归计算二叉树的叶子节点个数

    千次阅读 2018-07-24 00:07:35
    #include "stdio.h" #include "... /*结点的数据域*/  struct BiTNode *lchild , *rchild; /*指向左孩子和右孩子*/ } BiTNode , *BiTree; /*创建棵二叉树*/ void CreatBiTree(BiTr...

    #include "stdio.h"
    #include "malloc.h"

    typedef struct BiTNode{
        char data;   /*结点的数据域*/
        struct BiTNode *lchild , *rchild;  /*指向左孩子和右孩子*/
    } BiTNode , *BiTree;

    /*创建一棵二叉树*/
    void CreatBiTree(BiTree *T)
    {
        char c;
        scanf("%c",&c);
        if(c == ' ') *T = NULL;
        else{
           *T = (BiTNode * )malloc(sizeof(BiTNode));  /*创建根结点*/
            (*T)->data = c;    /*向根结点中输入数据*/
            CreatBiTree(&((*T)->lchild));  /*递归地创建左子树*/
            CreatBiTree(&((*T)->rchild));  /*递归地创建右子树*/
        }
    }

    int getLeavesConut(BiTree T) {
        int leftLeavesCount;
        int rightLeavesCount;
        if (T == NULL) {
            return 0;
        }else if (T->lchild == NULL && T->rchild == NULL) {
            return 1;
        }else {
            leftLeavesCount = getLeavesConut(T->lchild);
            rightLeavesCount = getLeavesConut(T->rchild);
            return leftLeavesCount + rightLeavesCount;
        }
    }
    main()
    {
       BiTree T = NULL;                /*初始化T */
       int count = 0;
       printf("Input some characters to create a binary tree \n");
       CreatBiTree(&T);                /*创建一棵二叉树*/
      count =  getLeavesConut (T);    /*计算二叉树中叶子结点的个数 */
       printf("The number of leaves of BTree are %d\n",count);
       getchar();
       getchar();
    }

    展开全文
  • 需要先构造一个二叉树,再对二叉树进行遍历,遍历到叶子节点就输出和个数+1 二叉树的结点类: package com.alibaba.structure.school.two; // 节点类 public class BinaryNode<T> { public T data; ...
  • 给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。 例如,从根到叶子节点路径 1->2->3 代表数字 123。 计算从根到叶子节点生成的所有数字之和。 说明: 叶子节点...
  • 主要介绍了C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法,涉及C++二叉树的定义、遍历、统计相关操作技巧,需要的朋友可以参考下
  • 给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。 例如,从根到叶子节点路径 1->2->3 代表数字 123。 计算从根到叶子节点生成的所有数字之和。 说明: 叶子节点...
  • 计算二叉树叶子结点个数 C/C++

    千次阅读 2020-07-03 11:03:37
    这棵二叉树中叶子结点为红色圈圈中的节点,共有 5 。 看代码: #include<iostream> using namespace std; typedef struct BinaryTreeNode { char data; //数据 struct BinaryTreeNode *left; //左孩子...
  • 求二叉树的结点个数 空树返回0,其他返回左子树节点数+右子树节点数+1 //求二叉树的结点个数 int GetSize(BNode *root) { if (root == NULL) { return 0; } return GetSize(root-&amp;gt;left...
  • 以二叉链表作为二叉树的存储结构,求二叉树的叶子结点个数。 输入格式: 输入二叉树的先序序列。 提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。 ...
  • 二叉树:计算叶子节点个数

    千次阅读 2019-11-03 18:55:15
    叶子节点的特征:左右孩子均为NULL struct node { int val; node *left, *right; }; int countLeaf(node *root) { if (!root) return 0; else { if (!root->left && !root->right) return 1; ...
  • 求二叉树的叶子结点个数

    千次阅读 2018-12-21 12:33:35
    7-5 求二叉树的叶子结点个数 (20 分) 以二叉链表作为二叉树的存储结构,求二叉树的叶子结点个数。 输入格式: 输入二叉树的先序序列。 提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树...
  • 数据结构中,经常遇到这样的考题,就是计算二叉树中叶子节点的个数。我用递归是思想来进行计算,具体代码如下: 判断链表是否升序或降序:
  • 根据树和节点的度计算叶子节点数

    千次阅读 2020-02-12 14:51:41
    设树T的度为4,其中度为1,2,3,4的节点个数分别为4,2,1,1,则树T中叶子节点数为? 节点的度和总节点数有如下关系: n = m+1, #n是总节点数,m是节点度的和 树的深度和总结点数有如下关系: k = log2n 深度和叶子节点数...
  • 二叉树叶子节点个数计算

    千次阅读 2011-03-15 21:56:00
    (3)某二叉树有5个度为2的结点,则该二叉树中的叶子结点数是( )A)10 B)8 C)6 D)4此类型是知道两个节点的个数求叶子节点,设有n个度为2的节点,则叶子节点个数=n+1;节点总数=2*n+1;
  • 根节点 到叶子节点组成一个数 前序遍历 每层的值都为上一层*10+本层结点的值 int sumNumbers(TreeNode *root) { int sum=0; if(root==NULL) return sum; return PreOrder(root,sum); } int PreO
  • 计算二叉树的第k层中所有叶子结点个数 Time Limit:1000MS Memory Limit:65535K 题型: 编程题 语言: 无限制 描述 二叉链表表示的二叉树:按先序次序输入二叉树中结点的值,’#'字符表示空树,构造二叉链表表示的...
  • 昨天面试,有一道题是:完全二叉树,知道总节点数计算叶子结点的数量。由于当时要求在纸上写代码,没有实际运行,所以回来后他这代码调试一下. // Challenge8.cpp : Defines the entry point for the console...
  • 前面我们讲了关于数据结构中的堆栈问题,这篇文章主要是为大家简要介绍一下二叉树,并实现二叉树的创建、计算叶子结点个数、递归遍历、判断是否是完全二叉树等相关问题~ 、二叉树的介绍 1、什么是二叉树 棵...
  • 一、假设二叉树采用二叉链存储结构,设计一个算法,计算一颗给定二叉树的所有节点数。 解法一 int n; void count(BTNode* p) { if(p) { ++n; count(p->left); count(p->right); } } 解法二 int ...
  • 设二叉树采用链式存储结构,试设计一个算法计算一颗给定二叉树叶子节点的数目
  • 实验报告 采用链式存储结构求任意给出的二叉树的叶子节点个数,过程有详解,包括过程中的错误。
  • 内容: 1、计算二叉树叶子节点的个数。 2、交换二叉树所有节点的左、右孩子节点。 3、根据二叉树的前序遍历和中序遍历的结果,构造二叉树。
  • 二叉树叶子节点个数 递归方式 (1)如果给定节点pRoot为NULL,则是空树,叶子节点为0,返回0; (2)如果给定节点pRoot左右子树均为NULL,则是叶子节点,且叶子节点数为1,返回1; (3)如果给定节点pRoot左右子树不...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 223,148
精华内容 89,259
关键字:

如何计算一个树的叶子节点