您的位置:首页 > 其它

二叉树求高度、叶子节点个数、总节点个数

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;

}

}

}

其中求二叉树的高度那个方法,有图帮助理解,参考链接:二叉树的深度,递归和非递归实现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: