LeetCode 1273. 删除树节点(拓扑排序/DFS)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 1273. 删除树节点(拓扑排序/DFS)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目
- 2. 解題
- 2.1 取巧解
- 2.2 拓?fù)渑判?/li>
- 2.3 建圖+DFS
1. 題目
給你一棵以節(jié)點 0 為根節(jié)點的樹,定義如下:
節(jié)點的總數(shù)為 nodes 個; 第 i 個節(jié)點的值為 value[i] ; 第 i 個節(jié)點的父節(jié)點是 parent[i] 。 請你刪除節(jié)點值之和為 0 的每一棵子樹。在完成所有刪除之后,返回樹中剩余節(jié)點的數(shù)目。
示例:
來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/delete-tree-nodes
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
2. 解題
2.1 取巧解
- 數(shù)據(jù)很特殊,數(shù)據(jù)尾部為更深的節(jié)點,逆序遍歷即是自底向上
- 該解法不通用
60 ms 21.1 MB
2.2 拓?fù)渑判?/h3> class Solution { public:int deleteTreeNodes(int nodes, vector<int>& parent, vector<int>& value) {int i, n = parent.size();vector<int> indegree(n,0);for(i = 0; i < n; ++i)if(parent[i] != -1)indegree[parent[i]]++;queue<int> q;for(i = 0; i < n; ++i)if(indegree[i] == 0)q.push(i);vector<int> count(n,1);while(!q.empty()){int tp = q.front();q.pop();if(value[tp]==0)count[tp] = 0;if(parent[tp] == -1)continue;if(--indegree[parent[tp]]==0)q.push(parent[tp]);value[parent[tp]] += value[tp];count[parent[tp]] += count[tp];}return count[0];} };
88 ms 22.2 MB
2.3 建圖+DFS
class Solution {vector<vector<int>> edges;vector<int> count; public:int deleteTreeNodes(int nodes, vector<int>& parent, vector<int>& value) {int i, n = parent.size();edges.resize(n);count = vector<int>(n,1);for(i = 0; i < n; ++i)if(parent[i] != -1)edges[parent[i]].push_back(i);dfs(0, parent, value);return count[0];}void dfs(int id, vector<int>& parent, vector<int>& value){for(int next : edges[id]){dfs(next, parent, value);}if(value[id]==0)count[id] = 0;if(parent[id] != -1){value[parent[id]] += value[id];count[parent[id]] += count[id];}} };96 ms 29.4 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關(guān)注我的公眾號(Michael阿明),一起加油、一起學(xué)習(xí)進(jìn)步!
總結(jié)
以上是生活随笔為你收集整理的LeetCode 1273. 删除树节点(拓扑排序/DFS)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode MySQL 1421.
- 下一篇: LeetCode 875. 爱吃香蕉的珂