网易首页 > 网易号 > 正文 申请入驻

2026-10-20:统计二叉树中支配节点的数量。用go语言,给定一棵完全二叉树的根节点 root,树中每个节点都有一个值。 对于一个节点 x,考察

0
分享至

2026-10-20:统计二叉树中支配节点的数量。用go语言,给定一棵完全二叉树的根节点 root,树中每个节点都有一个值。

对于一个节点 x,考察由 x 本身以及它的全部后代节点组成的子树。如果 x 的值恰好等于这个子树中所有节点值的最大值,那么就称 x 是一个支配节点。

完全二叉树是指:除了最后一层之外,其余每一层都被节点填满;最后一层的节点则按照从左到右的顺序尽量靠左排列。

现在需要统计并返回这棵树中支配节点的总数。

树中的节点数量在范围 [1, 100000] 内。

1 <= Node.val <= 1000000000。

保证给定的树是一棵完全二叉树。

输入: root = [5,3,8,2,4,7,1]。

输出: 5。

解释:

值为 2、4、7 和 1 的叶节点都是支配节点。

值为 8 的节点是支配节点,因为它的值是其子树 [8, 7, 1] 中的最大值。

因此,答案为 5。

题目来自力扣3997。

大体步骤如下:

  1. 1. 明确递归函数的职责
    定义一个递归函数,用来处理以某个节点为根的子树。它的核心任务是:返回这棵子树中所有节点值的最大值。同时,在递归过程中统计支配节点的数量。

  2. 2. 处理空节点
    如果当前节点为空,说明已经越过了叶子节点。此时直接返回 0。
    题目中节点值都大于等于 1,所以把空子树的“最大值”设为 0 不会影响后续比较,也能让叶子节点自然地被判断为支配节点。

  3. 3. 先递归处理左右子树
    对于当前节点,先分别递归处理它的左子树和右子树。
    左子树递归结束后会返回左子树中的最大值,右子树递归结束后会返回右子树中的最大值。
    因为先处理左右子树,再处理当前节点,所以整体是一个后序遍历式的深度优先搜索。

  4. 4. 计算当前节点后代子树中的最大值
    将左子树返回的最大值和右子树返回的最大值进行比较,取较大的一个,记为 mx。
    此时 mx 表示当前节点的左右子树中所有节点值的最大值,不包含当前节点本身。

  5. 5. 判断当前节点是否为支配节点
    比较当前节点的值和 mx。
    如果当前节点的值大于或等于 mx,说明当前节点值不小于它所有后代节点中的最大值。
    又因为子树最大值一定来自“当前节点本身”或“后代节点”,所以此时当前节点值就是整棵子树的最大值。
    因此当前节点满足“节点值等于子树中所有节点值的最大值”的条件,支配节点数量加一。
    如果当前节点值小于 mx,说明后代中存在比当前节点更大的值,当前节点不可能是子树最大值,不计数。

  6. 6. 返回当前子树的整体最大值
    如果当前节点被判定为支配节点,也就是当前节点值大于或等于后代最大值,那么整棵子树的最大值就是当前节点值,于是把 mx 更新为当前节点值。
    如果当前节点不是支配节点,说明后代最大值 mx 已经大于当前节点值,整棵子树最大值仍然是 mx。
    最后把这个最大值返回给上一层递归。

  7. 7. 主过程调用递归并得到答案
    从根节点开始调用递归函数。递归会自底向上处理每个节点,并在过程中不断累加支配节点数量。
    递归结束后,累加得到的数量就是整棵树中支配节点的总数,将其输出。

  8. 8. 用示例说明执行过程
    示例完全二叉树按层序为:5、3、8、2、4、7、1。

  • • 节点 2 是叶子,左右为空,后代最大值为 0,2 大于等于 0,计数加一,返回 2。

  • • 节点 4 是叶子,后代最大值为 0,4 大于等于 0,计数加一,返回 4。

  • • 节点 3 的左子树最大值为 2,右子树最大值为 4,后代最大值为 4。因为 3 小于 4,所以节点 3 不是支配节点,返回 4。

  • • 节点 7 是叶子,计数加一,返回 7。

  • • 节点 1 是叶子,计数加一,返回 1。

  • • 节点 8 的左子树最大值为 7,右子树最大值为 1,后代最大值为 7。因为 8 大于等于 7,所以节点 8 是支配节点,计数加一,返回 8。

  • • 根节点 5 的左子树最大值为 4,右子树最大值为 8,后代最大值为 8。因为 5 小于 8,所以根节点 5 不是支配节点,返回 8。
    最终被计数的节点是 2、4、7、1、8,共 5 个,输出 5。

9. 时间复杂度
每个节点都会被递归访问一次,空节点也会产生常数次判断,因此总时间复杂度是 O(n),其中 n 是树中节点数量。

10. 额外空间复杂度
算法主要使用递归调用栈。由于题目保证是完全二叉树,树的高度为 O(log n),所以递归栈的最大深度也是 O(log n)。除递归栈外只使用了常数个变量。因此总额外空间复杂度是 O(log n)。

Go完整代码如下:

package main

import"fmt"

type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}

func countDominantNodes(root *TreeNode) (ans int) {
// dfs(node) 返回 node 子树中的最大节点值
var dfs func(*TreeNode)int
dfs = func(node *TreeNode)int {
if node == nil {
return0
}

mx := maxInt(dfs(node.Left), dfs(node.Right))
if node.Val >= mx {
// node.Val 是 node 子树中的最大节点值
ans++
mx = node.Val
}
return mx
}

dfs(root)
return
}

func maxInt(a, b int)int {
if a > b {
return a
}
return b
}

func main() {
// 完全二叉树层序为:5, 3, 8, 2, 4, 7, 1
root := &TreeNode{
Val: 5,
Left: &TreeNode{
Val: 3,
Left: &TreeNode{
Val: 2,
},
Right: &TreeNode{
Val: 4,
},
},
Right: &TreeNode{
Val: 8,
Left: &TreeNode{
Val: 7,
},
Right: &TreeNode{
Val: 1,
},
},
}

result := countDominantNodes(root)
fmt.Println(result)
}

Python完整代码如下:

# -*-coding:utf-8-*-

from typing import Optional

class TreeNode:
def __init__(self, val: int = 0,
left: Optional["TreeNode"] = None,
right: Optional["TreeNode"] = None):
self.val = val
self.left = left
self.right = right

def count_dominant_nodes(root: Optional[TreeNode]) -> int:
ans = 0

# dfs(node) 返回 node 子树中的最大节点值
def dfs(node: Optional[TreeNode]) -> int:
nonlocal ans
if node is None:
return0

mx = max(dfs(node.left), dfs(node.right))
if node.val >= mx:
# node.val 是 node 子树中的最大节点值
ans += 1
mx = node.val
return mx

dfs(root)
return ans

if __name__ == "__main__":
# 完全二叉树层序为:5, 3, 8, 2, 4, 7, 1
root = TreeNode(
5,
left=TreeNode(
3,
left=TreeNode(2),
right=TreeNode(4),
),
right=TreeNode(
8,
left=TreeNode(7),
right=TreeNode(1),
),
)

result = count_dominant_nodes(root)
print(result)

C++完整代码如下:

  



struct TreeNode {
int Val;
TreeNode *Left;
TreeNode *Right;

TreeNode(int val = 0, TreeNode *left = nullptr, TreeNode *right = nullptr)
: Val(val), Left(left), Right(right) {}
};

int countDominantNodes(TreeNode *root) {
int ans = 0;

// dfs(node) 返回 node 子树中的最大节点值
// 用 std::function 或者 lambda 递归;这里用 auto 自递归 Lambda
auto dfs = [&](auto &&self, TreeNode *node) -> int {
if (node == nullptr) {
return0;
}

int mx = std::max(self(self, node->Left), self(self, node->Right));
if (node->Val >= mx) {
// node->Val 是 node 子树中的最大节点值
++ans;
mx = node->Val;
}
return mx;
};

dfs(dfs, root);
return ans;
}

int main() {
// 完全二叉树层序为:5, 3, 8, 2, 4, 7, 1
TreeNode *root = new TreeNode(
5,
new TreeNode(
3,
new TreeNode(2),
new TreeNode(4)
),
new TreeNode(
8,
new TreeNode(7),
new TreeNode(1)
)
);

int result = countDominantNodes(root);
std::cout << result << std::endl;

// 释放内存
auto freeTree = [](auto &&self, TreeNode *node) -> void {
if (node == nullptr) return;
self(self, node->Left);
self(self, node->Right);
delete node;
};
freeTree(freeTree, root);

return0;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
国防部回应美官员分析中国大陆攻台时间:何时以何种方式解决台湾问题,完全是中国人自己的事,外部势力无权干涉

国防部回应美官员分析中国大陆攻台时间:何时以何种方式解决台湾问题,完全是中国人自己的事,外部势力无权干涉

极目新闻
2026-10-29 20:05:16
“黑天鹅”突袭!今天,大跳水!

“黑天鹅”突袭!今天,大跳水!

金融界
2026-10-29 12:00:27
塞尔电台:皇马原本不想就姆巴佩事件发声明,因中国赞助约 2000 万欧被迫表态

塞尔电台:皇马原本不想就姆巴佩事件发声明,因中国赞助约 2000 万欧被迫表态

小青年渌渌
2026-10-29 16:36:51
巴基斯坦,光速屈服!向台湾所有飞机关闭领空仅三天,立马又放行

巴基斯坦,光速屈服!向台湾所有飞机关闭领空仅三天,立马又放行

青青衫书生
2026-10-29 15:30:08
大衣哥风波愈演愈烈,警方现已介入,其邻居早就爆料他私下人品

大衣哥风波愈演愈烈,警方现已介入,其邻居早就爆料他私下人品

寒士之言本尊
2026-10-29 13:07:02
纯电汽车可能会被时代抛弃?内行人预言:下一个主角已登场!

纯电汽车可能会被时代抛弃?内行人预言:下一个主角已登场!

兴趣知识
2026-10-29 03:02:21
杨兰兰案今天开庭,她有钱、有车、有房,就是查不到她是谁

杨兰兰案今天开庭,她有钱、有车、有房,就是查不到她是谁

陈鹰
2026-10-29 08:39:23
3-2险胜!男单爆大冷!就在刚刚,WTT冠军赛捷报:国乒克星出局,29岁周启豪再创奇迹!王皓立大功

3-2险胜!男单爆大冷!就在刚刚,WTT冠军赛捷报:国乒克星出局,29岁周启豪再创奇迹!王皓立大功

锐评利物浦
2026-10-29 10:07:00
韩国外交部长赵显公开表示:如果局势进一步恶化,不排除韩国与乌克兰断绝外交关系的可能

韩国外交部长赵显公开表示:如果局势进一步恶化,不排除韩国与乌克兰断绝外交关系的可能

吉刻新闻
2026-10-28 23:16:45
央媒发文,高调官宣王楠新身份,资产查封被带走调查早就真相大白

央媒发文,高调官宣王楠新身份,资产查封被带走调查早就真相大白

削桐作琴
2026-10-29 15:18:11
最健康的食用油排名,葵花籽油落榜,大豆油仅第4,第1名才是yyds

最健康的食用油排名,葵花籽油落榜,大豆油仅第4,第1名才是yyds

新时代的两性情感
2026-10-27 06:45:06
皇马回应炸锅,人民日报重锤,姆巴佩完了

皇马回应炸锅,人民日报重锤,姆巴佩完了

鸣金网
2026-10-28 16:43:54
姆巴佩被抵制后,网上却陆续出现了他公开的支持者,这该怎么办?

姆巴佩被抵制后,网上却陆续出现了他公开的支持者,这该怎么办?

李昕言温度空间
2026-10-29 20:34:22
去中国化第一课!铰链不给大陆做,iPhone Duo屏幕漏液冲上热搜

去中国化第一课!铰链不给大陆做,iPhone Duo屏幕漏液冲上热搜

旧史新谭
2026-10-29 11:33:49
27岁抗癌博主去世,去年确诊三阴乳腺癌:起初以为是纤维瘤,没有重视,直到最后B超报出4C

27岁抗癌博主去世,去年确诊三阴乳腺癌:起初以为是纤维瘤,没有重视,直到最后B超报出4C

荔枝新闻
2026-10-29 16:50:56
最近辱华有点多,但不必那么敏感

最近辱华有点多,但不必那么敏感

凤眼论
2026-10-29 14:16:50
活久见!中金公司,历史上第5次跌停,发生了什么?

活久见!中金公司,历史上第5次跌停,发生了什么?

金石随笔
2026-10-29 15:48:14
河南多工厂暴雷!被曝用鸡脖泥做馅料,老板公开承认,尽量不要吃

河南多工厂暴雷!被曝用鸡脖泥做馅料,老板公开承认,尽量不要吃

削桐作琴
2026-10-29 15:22:06
旭日旗事件越闹越大!陈宇昕三代都是亲日分子,母亲身份已澄清

旭日旗事件越闹越大!陈宇昕三代都是亲日分子,母亲身份已澄清

平老师666
2026-10-27 20:56:19
贾乃亮以后或许不会直播带货了,不是因为带货业绩不好了,也不是挣够钱打算收手,而是他当下的经营模式,快让无数小直播间没有生存空间了

贾乃亮以后或许不会直播带货了,不是因为带货业绩不好了,也不是挣够钱打算收手,而是他当下的经营模式,快让无数小直播间没有生存空间了

放开他让wo来
2026-10-29 09:00:03
2026-10-29 23:11:00
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1542文章数 83关注度
往期回顾 全部

科技要闻

MacBook终于能触屏了:22999元起

头条要闻

00后宝妈在儿童医院门口卖3元盒饭:每卖一份倒贴7元

头条要闻

00后宝妈在儿童医院门口卖3元盒饭:每卖一份倒贴7元

体育要闻

超级黑马!球队不败 29岁的他得分榜前三

娱乐要闻

白百何被曝和二婚丈夫离婚 和男生逛街

财经要闻

两大娱乐巨头,谈崩了

汽车要闻

标配宁德时代电池 智己LS8 NEO纯电预售24.98万起

态度原创

旅游
家居
手机
数码
公开课

旅游要闻

不止呼伦贝尔,西南这片草原藏着独一份山野浪漫!

家居要闻

2026建博会(广州) 公装联探展交流活动

手机要闻

iQOO Neo12线下上手:屏幕和风扇是真的,DECO和黑边也是真的!

数码要闻

庆祝《ARC Raiders》发售一周年,海盗船携旗下品牌推出联名外设

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版