计算二叉树的某个节点的高度

参考链接:

力扣icon-default.png?t=M3K6https://leetcode-cn.com/problems/balanced-binary-tree/solution/ping-heng-er-cha-shu-by-leetcode-solution/

· 

公式: 

定义函数 height,用于计算二叉树中的任意一个节点 p 的高度:

  

只能先递归向下,然后回溯,回溯时累加求出高度;

公式就是:

        当前node节点的高度=【(node节点的左子树的高度) VS (node节点的右子树的高度)的最大值】+1

·

代码示例:

/**
* 求出指定节点的高度
*          只能先递归向下,然后回溯,回溯时累加求出高度;
*          公式就是:当前node节点的高度=【(node节点的左子树的高度)和(node节点的右子树的高度)的最大值】+1
* @param node
*/
public int findHeightByNode(TreeNode node) {
	//公式:当前node节点的高度=【(node节点的左子树的高度)和(node节点的右子树的高度)的最大值】+1
	if (node == null) {
		  return 0; //叶子结点的左右子节点为null,直接返回0,回溯之后叶子节点的高度为1;
	}
	TreeNode leftNode = node.left; //左子结点
	TreeNode rightNode = node.right; //右子节点
	int height = Math.max(findHeightByNode(leftNode), findHeightByNode(rightNode))+1;
	return height;
}


  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现二叉树的数据结构主要需要定义一个二叉树节点结构体,包括节点值、左右子节点指针。具体实现如下: ```c typedef struct TreeNode { int val; // 节点值 struct TreeNode *left; // 左子节点指针 struct TreeNode *right; // 右子节点指针 } TreeNode; ``` 接下来我们需要实现二叉树的创建、度、高度、叶子节点个数计算以及遍历等操作。 1. 从键盘输入数据,创建二叉树 为了从键盘输入数据,可以使用 scanf 函数。具体实现如下: ```c // 创建二叉树 TreeNode* createTree() { int val; scanf("%d", &val); if (val == -1) { // -1 表示该节点为空 return NULL; } TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = val; root->left = createTree(); root->right = createTree(); return root; } ``` 2. 计算叉树的度、高度、叶子节点的个数 二叉树的度是指二叉树中各节点的度的最大值,也就是某个节点的左右子节点的数量。二叉树高度是指从根节点到最深叶子节点的路径长度,而叶子节点则是指没有子节点节点计算叉树的度、高度、叶子节点的个数可以使用递归的方式实现。具体实现如下: ```c // 计算叉树的度 int getDegree(TreeNode* root) { if (!root) { return 0; } int leftDegree = getDegree(root->left); int rightDegree = getDegree(root->right); int maxDegree = leftDegree > rightDegree ? leftDegree : rightDegree; if (root->left && root->right) { maxDegree = maxDegree > 2 ? maxDegree : 2; } else if (root->left || root->right) { maxDegree = maxDegree > 1 ? maxDegree : 1; } return maxDegree; } // 计算叉树高度 int getHeight(TreeNode* root) { if (!root) { return 0; } int leftHeight = getHeight(root->left); int rightHeight = getHeight(root->right); return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1; } // 计算叉树叶子节点的个数 int getLeafCount(TreeNode* root) { if (!root) { return 0; } if (!root->left && !root->right) { return 1; } return getLeafCount(root->left) + getLeafCount(root->right); } ``` 3. 按前序、中序、后序遍历二叉树,并输出遍历序列 二叉树的遍历有三种方式:前序遍历、中序遍历和后序遍历,具体实现如下: ```c // 前序遍历二叉树 void preOrderTraverse(TreeNode* root) { if (!root) { return; } printf("%d ", root->val); preOrderTraverse(root->left); preOrderTraverse(root->right); } // 中序遍历二叉树 void inOrderTraverse(TreeNode* root) { if (!root) { return; } inOrderTraverse(root->left); printf("%d ", root->val); inOrderTraverse(root->right); } // 后序遍历二叉树 void postOrderTraverse(TreeNode* root) { if (!root) { return; } postOrderTraverse(root->left); postOrderTraverse(root->right); printf("%d ", root->val); } ``` 最后,我们可以将以上操作整合到一个完整的程序中: ```c #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { int val; // 节点值 struct TreeNode *left; // 左子节点指针 struct TreeNode *right; // 右子节点指针 } TreeNode; // 创建二叉树 TreeNode* createTree() { int val; scanf("%d", &val); if (val == -1) { // -1 表示该节点为空 return NULL; } TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = val; root->left = createTree(); root->right = createTree(); return root; } // 计算叉树的度 int getDegree(TreeNode* root) { if (!root) { return 0; } int leftDegree = getDegree(root->left); int rightDegree = getDegree(root->right); int maxDegree = leftDegree > rightDegree ? leftDegree : rightDegree; if (root->left && root->right) { maxDegree = maxDegree > 2 ? maxDegree : 2; } else if (root->left || root->right) { maxDegree = maxDegree > 1 ? maxDegree : 1; } return maxDegree; } // 计算叉树高度 int getHeight(TreeNode* root) { if (!root) { return 0; } int leftHeight = getHeight(root->left); int rightHeight = getHeight(root->right); return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1; } // 计算叉树叶子节点的个数 int getLeafCount(TreeNode* root) { if (!root) { return 0; } if (!root->left && !root->right) { return 1; } return getLeafCount(root->left) + getLeafCount(root->right); } // 前序遍历二叉树 void preOrderTraverse(TreeNode* root) { if (!root) { return; } printf("%d ", root->val); preOrderTraverse(root->left); preOrderTraverse(root->right); } // 中序遍历二叉树 void inOrderTraverse(TreeNode* root) { if (!root) { return; } inOrderTraverse(root->left); printf("%d ", root->val); inOrderTraverse(root->right); } // 后序遍历二叉树 void postOrderTraverse(TreeNode* root) { if (!root) { return; } postOrderTraverse(root->left); postOrderTraverse(root->right); printf("%d ", root->val); } int main() { printf("请输入二叉树节点值,-1 表示该节点为空:\n"); TreeNode* root = createTree(); printf("\n"); printf("二叉树的度为:%d\n", getDegree(root)); printf("二叉树高度为:%d\n", getHeight(root)); printf("二叉树的叶子节点个数为:%d\n", getLeafCount(root)); printf("\n"); printf("前序遍历二叉树:"); preOrderTraverse(root); printf("\n"); printf("中序遍历二叉树:"); inOrderTraverse(root); printf("\n"); printf("后序遍历二叉树:"); postOrderTraverse(root); printf("\n"); return 0; } ``` 以上就是使用 C 语言实现二叉树的全部内容了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值