C实现:求二叉树的高度

理论思路

在这里插入图片描述
(图来自浙大数据结构课程)

很明显,求树的高度,是左右子树中最高的再加一。
那么怎么求左子树的高度呢?就是其左右子树中最高的加一。
那么怎么求右子树的高度呢?就是其左右子树中最高的加一。

这样就形成了 递归,我们利用后序遍历的程序,稍加修改便可成为求二叉树高度的程序。

求二叉树高度:

int PostOrderGetHeight(BinTree BT){
	int HL,HR,MaxH;
	if(BT){
		HL=PostOrderGetHeight(BT->Left);
		HR=PostOrderGetHeight(BT->Right);
		MaxH=HL > HR ? HL : HR;
		return (MaxH+1);
	}else{
		return 0;
	}
}

理解:
碰到叶子节点时,HL和HR的值都为0,最后返回时,叶子节点的高度就是1。
然后将这个高度原路返回给父节点的HL或者HR。

 

C代码实现

1.利用前序遍历思想创建二叉树
2.求二叉树的高度

#include <stdio.h>
#include <stdlib.h>

typedef char DataType;

typedef struct Node *BinTree;
typedef BinTree NodeLink;
typedef struct Node TreeNode;

struct Node{
	DataType data;
	NodeLink Left,Right;
};

void creat_BinTree(BinTree *T){
	char ch;
	scanf("%c",&ch);
	
	if(ch=='#'){
		*T=NULL;
	}else{
		*T=(TreeNode*)malloc(sizeof(TreeNode));
		(*T)->data=ch;
		(*T)->Left=NULL;
		(*T)->Right=NULL;
		
		creat_BinTree(&((*T)->Left));
		creat_BinTree(&((*T)->Right));
	}
} 

int PostOrderGetHeight(BinTree BT){
	int HL,HR,MaxH;
	if(BT){
		HL=PostOrderGetHeight(BT->Left);
		HR=PostOrderGetHeight(BT->Right);
		MaxH=HL > HR ? HL : HR;
		return (MaxH+1);
	}else{
		return 0;
	}
} 

int main(int argc, char *argv[]) {
	BinTree Tree;
	creat_BinTree(&Tree);
	int h=PostOrderGetHeight(Tree);
	printf("树的高度:%d",h);
	return 0;
}

二叉树如下:
在这里插入图片描述
在这里插入图片描述

 

  • 16
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
答:好的,我可以为您解答这个问题。 您可以参考以下 C 语言代码实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 给定二叉树的叶结点数 int leafNodeCount(TreeNode* root) { if (!root) { return 0; } if (!root->left && !root->right) { return 1; } return leafNodeCount(root->left) + leafNodeCount(root->right); } // 给定二叉树的结点数 int nodeCount(TreeNode* root) { if (!root) { return 0; } return 1 + nodeCount(root->left) + nodeCount(root->right); } // 给定二叉树高度 int height(TreeNode* root) { if (!root) { return 0; } int leftHeight = height(root->left); int rightHeight = height(root->right); return 1 + (leftHeight > rightHeight ? leftHeight : rightHeight); } int main() { // 创建二叉树 TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = 1; root->left = (TreeNode*)malloc(sizeof(TreeNode)); root->left->val = 2; root->left->left = NULL; root->left->right = NULL; root->right = (TreeNode*)malloc(sizeof(TreeNode)); root->right->val = 3; root->right->left = (TreeNode*)malloc(sizeof(TreeNode)); root->right->left->val = 4; root->right->left->left = NULL; root->right->left->right = NULL; root->right->right = (TreeNode*)malloc(sizeof(TreeNode)); root->right->right->val = 5; root->right->right->left = NULL; root->right->right->right = NULL; // 二叉树的叶结点数、结点数、高度 int leafCount = leafNodeCount(root); int nodeCount = nodeCount(root); int treeHeight = height(root); printf("leafCount: %d, nodeCount: %d, treeHeight: %d\n", leafCount, nodeCount, treeHeight); // 释放二叉树的内存 free(root->left); free(root->right->left); free(root->right->right); free(root); return 0; } ``` 上述代码创建了一个带有 5 个结点的二叉树,并且使用了三个函数来分别二叉树的叶结点数、结点数和高度。您可以按照代码中的样式创建自己的二叉树,并调用这三个函数来获取所需的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值