如何修改二叉树求最大值代码 仅统计叶子节点的最大值
修改思路
原代码会将所有节点的值纳入比较,所以返回的是整棵树的最大值。要实现仅对比叶子节点的需求,核心是新增叶子节点判断逻辑:左右子节点都为NULL的节点才是叶子节点,只有这类节点的值需要参与最大值比较,非叶子节点仅负责传递左右子树的叶子最大值,自身值不纳入计算。
调整后代码(两种实现可选)
写法1:使用INT_MIN做初始值
需提前引入<limits.h>头文件使用INT_MIN常量:
int max_val(node *head){ // 当前节点是叶子节点,直接返回自身值 if (head->left == NULL && head->right == NULL) { return head->val; } int max = INT_MIN; if (head->left != NULL) { int leftmax = max_val(head->left); max = max > leftmax ? max : leftmax; } if (head->right != NULL) { int rightmax = max_val(head->right); max = max > rightmax ? max : rightmax; } return max; }
写法2:无需引入额外头文件
通过分支判断避免初始值问题,兼容性更强:
int max_val(node *head){ // 当前节点是叶子节点,直接返回自身值 if (head->left == NULL && head->right == NULL) { return head->val; } // 仅存在右子树,直接返回右子树的叶子最大值 if (head->left == NULL) { return max_val(head->right); } // 仅存在左子树,直接返回左子树的叶子最大值 if (head->right == NULL) { return max_val(head->left); } // 左右子树都存在,比较两者的叶子最大值返回 int leftmax = max_val(head->left); int rightmax = max_val(head->right); return leftmax > rightmax ? leftmax : rightmax; }
验证说明
对应你给出的二叉树:
- 叶子节点2、3、4、6满足判断条件,直接返回自身值
- 非叶子节点7对比左右返回的2和3,返回3
- 非叶子节点8对比左右返回的4和6,返回6
- 根节点3对比左右返回的3和6,最终返回6,符合需求。
内容的提问来源于stack exchange,提问作者user16910475
相关产品推荐
相关产品推荐

