二叉树求高度、叶子节点个数、总节点个数
2015-12-08 09:13
489 查看
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
char data;
struct node *lChild;
struct node *rChild;
}BinaryTreeNode;
typedef struct {
BinaryTreeNode *root;
int count;
}BinaryTree;
BinaryTree *makeTree();
BinaryTreeNode *makeNode(char,BinaryTreeNode *,BinaryTreeNode *);
int FindTreeDeep(BinaryTreeNode *);
int FindTreeNodeOfN0(BinaryTreeNode *);
int FindTreeNodeOfAll(BinaryTreeNode *);
;
//创建每一个节点
BinaryTreeNode *makeNode(char data,BinaryTreeNode *lChild,BinaryTreeNode *rChild) {
BinaryTreeNode *temp = NULL;
temp = (BinaryTreeNode *)malloc(sizeof (BinaryTreeNode));
temp->data = data;
temp->lChild = lChild;
temp->rChild = rChild;
return temp;
}
//此处的 s 是为了阻止还未创建二叉树,就求 高度、叶子节点数、节点总数
int s = 0;
//创建二叉树
BinaryTree *makeTree() {
s = 1;
BinaryTreeNode *node[10];
BinaryTree *tree = NULL;
//J
node[9] = makeNode('J',NULL,NULL);
//I
node[8] = makeNode('I',NULL,node[9]);
//H
node[7] = makeNode('H',NULL,NULL);
//G
node[6] = makeNode('G',NULL,NULL);
//F
node[5] = makeNode('F',node[8],NULL);
//E
node[4] = makeNode('E',node[6],node[7]);
//D
node[3] = makeNode('D',NULL,NULL);
//C
node[2] = makeNode('C',NULL,node[5]);
//B
node[1] = makeNode('B',node[3],node[4]);
//A
node[0] = makeNode('A',node[1],node[2]);
tree = (BinaryTree *)malloc(sizeof (BinaryTree));
tree->root = node[0];
tree->count = 10;
printf("\n创建与初始化成功\n");
return tree;
}
//求二叉树高度
int FindTreeDeep(BinaryTreeNode *root){
int deep=0;
if(root){
int lchilddeep=FindTreeDeep(root->lChild);
int rchilddeep=FindTreeDeep(root->rChild);
deep=lchilddeep>=rchilddeep?lchilddeep+1:rchilddeep+1;
}
return deep;
}
//求二叉树的 叶子节点个数
int i = 0;
int FindTreeNodeOfN0(BinaryTreeNode *root) {
if(root == NULL)
return;
if(root->lChild
== NULL && root->rChild == NULL) {
i++;
}
FindTreeNodeOfN0(root->lChild);
FindTreeNodeOfN0(root->rChild);
return i;
}
//求节点总数
int j = 0;
int FindTreeNodeOfAll(BinaryTreeNode *root) {
if(root == NULL)
return;
j++;
FindTreeNodeOfAll(root->lChild);
FindTreeNodeOfAll(root->rChild);
return j;
}
int main(int argc, char *argv[])
{
BinaryTree *tree = NULL;
int choice;
int value;
while(1) {
printf("\n-----二叉树链表-----\n");
printf("\n-----1.创建与初始化-----\n");
printf("\n-----2.二叉树高度-----\n");
printf("\n-----3.二叉树叶子节点-----\n");
printf("\n-----4.二叉树节点总数-----\n");
printf("\n-----0.退出-----\n");
printf("请输入您的选择:");
scanf("%d",&choice);
switch(choice) {
case 1:
tree = makeTree();
break;
case 2:
if(s == 1) {
value = FindTreeDeep(tree->root);
printf("\n深度为:%d\n",value);
break;
}else {
printf("\n二叉树还未创建!\n");
break;
}
case 3:
if(s == 1) {
//把 i 重置为 0 ,防止多次调用该方法后,
i 的累加
i = 0;
value = FindTreeNodeOfN0(tree->root);
printf("\n叶子节点个数为:%d个\n",value);
break;
}else {
printf("\n二叉树还未创建!\n");
break;
}
case 4:
if(s == 1) {
//把 j 重置为 0 ,防止多次调用该方法后, j 的累加
j = 0;
value = FindTreeNodeOfAll(tree->root);
printf("\n节点总数为:%d个\n",value);
break;
}else {
printf("\n二叉树还未创建!\n");
break;
}
case 0:
return 0;
break;
default:
printf("您的选择有误!");
break;
}
}
}
其中求二叉树的高度那个方法,有图帮助理解,参考链接:二叉树的深度,递归和非递归实现
#include <stdlib.h>
typedef struct node {
char data;
struct node *lChild;
struct node *rChild;
}BinaryTreeNode;
typedef struct {
BinaryTreeNode *root;
int count;
}BinaryTree;
BinaryTree *makeTree();
BinaryTreeNode *makeNode(char,BinaryTreeNode *,BinaryTreeNode *);
int FindTreeDeep(BinaryTreeNode *);
int FindTreeNodeOfN0(BinaryTreeNode *);
int FindTreeNodeOfAll(BinaryTreeNode *);
;
//创建每一个节点
BinaryTreeNode *makeNode(char data,BinaryTreeNode *lChild,BinaryTreeNode *rChild) {
BinaryTreeNode *temp = NULL;
temp = (BinaryTreeNode *)malloc(sizeof (BinaryTreeNode));
temp->data = data;
temp->lChild = lChild;
temp->rChild = rChild;
return temp;
}
//此处的 s 是为了阻止还未创建二叉树,就求 高度、叶子节点数、节点总数
int s = 0;
//创建二叉树
BinaryTree *makeTree() {
s = 1;
BinaryTreeNode *node[10];
BinaryTree *tree = NULL;
//J
node[9] = makeNode('J',NULL,NULL);
//I
node[8] = makeNode('I',NULL,node[9]);
//H
node[7] = makeNode('H',NULL,NULL);
//G
node[6] = makeNode('G',NULL,NULL);
//F
node[5] = makeNode('F',node[8],NULL);
//E
node[4] = makeNode('E',node[6],node[7]);
//D
node[3] = makeNode('D',NULL,NULL);
//C
node[2] = makeNode('C',NULL,node[5]);
//B
node[1] = makeNode('B',node[3],node[4]);
//A
node[0] = makeNode('A',node[1],node[2]);
tree = (BinaryTree *)malloc(sizeof (BinaryTree));
tree->root = node[0];
tree->count = 10;
printf("\n创建与初始化成功\n");
return tree;
}
//求二叉树高度
int FindTreeDeep(BinaryTreeNode *root){
int deep=0;
if(root){
int lchilddeep=FindTreeDeep(root->lChild);
int rchilddeep=FindTreeDeep(root->rChild);
deep=lchilddeep>=rchilddeep?lchilddeep+1:rchilddeep+1;
}
return deep;
}
//求二叉树的 叶子节点个数
int i = 0;
int FindTreeNodeOfN0(BinaryTreeNode *root) {
if(root == NULL)
return;
if(root->lChild
== NULL && root->rChild == NULL) {
i++;
}
FindTreeNodeOfN0(root->lChild);
FindTreeNodeOfN0(root->rChild);
return i;
}
//求节点总数
int j = 0;
int FindTreeNodeOfAll(BinaryTreeNode *root) {
if(root == NULL)
return;
j++;
FindTreeNodeOfAll(root->lChild);
FindTreeNodeOfAll(root->rChild);
return j;
}
int main(int argc, char *argv[])
{
BinaryTree *tree = NULL;
int choice;
int value;
while(1) {
printf("\n-----二叉树链表-----\n");
printf("\n-----1.创建与初始化-----\n");
printf("\n-----2.二叉树高度-----\n");
printf("\n-----3.二叉树叶子节点-----\n");
printf("\n-----4.二叉树节点总数-----\n");
printf("\n-----0.退出-----\n");
printf("请输入您的选择:");
scanf("%d",&choice);
switch(choice) {
case 1:
tree = makeTree();
break;
case 2:
if(s == 1) {
value = FindTreeDeep(tree->root);
printf("\n深度为:%d\n",value);
break;
}else {
printf("\n二叉树还未创建!\n");
break;
}
case 3:
if(s == 1) {
//把 i 重置为 0 ,防止多次调用该方法后,
i 的累加
i = 0;
value = FindTreeNodeOfN0(tree->root);
printf("\n叶子节点个数为:%d个\n",value);
break;
}else {
printf("\n二叉树还未创建!\n");
break;
}
case 4:
if(s == 1) {
//把 j 重置为 0 ,防止多次调用该方法后, j 的累加
j = 0;
value = FindTreeNodeOfAll(tree->root);
printf("\n节点总数为:%d个\n",value);
break;
}else {
printf("\n二叉树还未创建!\n");
break;
}
case 0:
return 0;
break;
default:
printf("您的选择有误!");
break;
}
}
}
其中求二叉树的高度那个方法,有图帮助理解,参考链接:二叉树的深度,递归和非递归实现
相关文章推荐
- javascript 保留两位小数
- 1058. A+B in Hogwarts (20)【水题】——PAT (Advanced Level) Practise
- MyBatis学习 之 一、MyBatis简介与配置MyBatis+Spring+MySql
- 人工智能:第六章 专家系统
- 【BestCoder Round 65E】【网络流+讨论 奇偶分类思想】n个数形成若干至少3元素素数环的可行性检验 数可以为1
- 计算直线角度
- 人工智能:第五章 计算智能(2)
- JAVA中字符串比较equals()和equalsIgnoreCase()的区别
- dumpbin命令查看dll导出函数
- 【BestCoder Round 65D】【树形DP 容斥思想】ZYB's Tree 求距离每个节点距离不超过k的节点数
- spring bean id和bean name的区别
- 图的邻接矩阵实现_MGraph
- JS与jQ读取xml文件的方法
- iOS开-UIKit( UITableView.h - -解读)
- 1057. Stack (30)【栈+树状数组】——PAT (Advanced Level) Practise
- 北京Uber优步司机奖励政策(12月8日)
- CSDN博文“待定”如何避免检测规则分析“待定”
- JavaScript----this陷阱的最全收集
- 【BestCoder Round 65C】【树状数组 动态查找第k大 O(nlogn)】ZYB's Premutation 告诉你前i个数中的逆序对数让你还原全排列
- android simple github 官网地址