先序遍历创建二叉树,对二叉树统计叶子节点个数和统计深度(创建二叉树时#代表空树,序列不能有误)

#include "stdio.h"

#include "string.h"

#include "malloc.h"

#define NULL 0

#define MAXSIZE 30

typedef struct BiTNode      //定义二叉树数据结构

{

char data;

struct BiTNode *lchild,*rchild;

} BiTNode;

void preCreate(BiTNode *& T)   //先序遍历建立二叉树,#代表空树

{

char ch;

ch=getchar();

if(ch==‘#‘)

T=NULL;

else

{

if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))

printf("Error!");

T->data=ch;

preCreate(T->lchild);

preCreate(T->rchild);

}

}

int getLeafNum(BiTNode *root)//统计二叉树叶子节点个数

{

int count=0;//叶子总数,左子树叶子数.右子数叶子数

int left_count=0;

int right_count=0;

/*判断根节点是否为null

若根节点不空,判断根节点是否是叶子,是的话叶子总数+1并返回,

若不是统计左子树叶子数目和右子数叶子数目并相加返回

若根节点为空,则叶子数为0并返回

*/

if(root)

{

if(root->lchild==NULL&&root->rchild==NULL)

count++;

else

{

left_count=getLeafNum(root->lchild);

right_count=getLeafNum(root->rchild);

count=left_count+right_count;

}

}

else

{

count=0;

}

return count;

}

int getTreeDepth(BiTNode *root)//统计二叉树深度

{

int depth=0;

int left_depth=0;

int right_depth=0;

/*

判断根节点是否为空,

若根节点为空,深度置为0,并返回

若根节点不为空,统计左子树深度,统计右子树深度,二者相加后再加上1(1位根节点)并返回

*/

if(root)

{

left_depth=getTreeDepth(root->lchild);

right_depth=getTreeDepth(root->rchild);

depth=1+(left_depth>right_depth?left_depth:right_depth);

}

else

{

depth=0;

}

return depth;

}

int main()

{

BiTNode * bitree=NULL;

preCreate(bitree);//先序遍历创建二叉树

printf("叶子个数:%d\n",getLeafNum(bitree));

printf("该二叉树深度:%d\n",getTreeDepth(bitree));

return 0;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-21 20:02:30

先序遍历创建二叉树,对二叉树统计叶子节点个数和统计深度(创建二叉树时#代表空树,序列不能有误)的相关文章

求二叉树的高度,叶子节点个数,第K层结点个数,求祖先结点问题

一.求二叉树的高度 类似归并排序的思想.先求最底层结点的高度,再分别比较生成更高的结点的高度.最后递归至根结点,求出根结点的高度. //求二叉树的高度 int Height() { return GetHeight(_root); } int GetHeight(Node<T> *root) { int left = 0; int right = 0; if (root->_leftchild != NULL) left += GetHeight(root->_leftchild)

六:二叉树中第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

求二叉树第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) +

PAT甲题题解-1004. Counting Leaves (30)-统计每层叶子节点个数+dfs

统计每层的叶子节点个数建树,然后dfs即可 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <vector> using namespace std; /* 统计每层的叶子节点个数 建树,然后dfs即可 */ const int maxn=105; int n,m; int layer[maxn]; //统计每层的叶子节点

二叉树(7)----求二叉树叶子节点个数,递归和非递归

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.求二叉树叶子节点数 叶子节点:即没有左右子树的结点 (1)递归方

创建二叉树求叶子节点个数

求二叉树叶子结点的个数,注意创建方法! //求二叉树中叶子结点的个数 #include<iostream> #define N 63 using namespace std; char str[] = "ab#d##c#e##"; //先建立根节点,然后再左右结点建立 int i = -1; typedef struct node { struct node *leftChild; struct node *rightChild; char data; }BiTreeNod

C二叉树求节点个数和叶子节点个数(递归形式)

1 struct BiTree 2 { 3 struct BiTree *lchild; 4 struct BiTree *rchild; 5 }; 6 7 int Node(struct BiTree *T) 8 { 9 if(T == NULL) 10 return 0; 11 return 1+Node(T->lchild)+Node(T->rchild); 12 } 13 14 int Leaf(struct BiTree *T) 15 { 16 if(T==NULL) 17 retu

二叉排序树的建立、先序/中序/后序遍历、查找

一.定义与性质 定义  二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree).其定义为:二叉排序树或者是空树. 性质 (1) 二叉排序树中任一结点x,其左(右)子树中任一结点y(若存在)的关键字必小(大)于x的关键字. (2) 二叉排序树中,各结点关键字是惟一的.  注意:实际应用中,不能保证被查找的数据集中各元素的关键字互不相同,所以可将二叉排序树定义中BST性质(1)里的"小于"改为"大于等于",或将BST

二叉树基本操作--创建,三种遍历,叶子节点

虽然二叉树的操作很常见,但是认真写写熟悉很重要,特别是typedef, CreateBiTree(BiTNode** T)指针的操作等等,还有就是创建方法,去实际输入值就知道其中的妙处,为-1时为空节点. #include <iostream> using namespace std; //节点的定义 typedef struct BTNode { int data; BTNode* rChild; BTNode* lChild; }BiTNode, *BiTree; //二叉树的创建,先序创