日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 1273. 删除树节点(拓扑排序/DFS)

發布時間:2024/7/5 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 1273. 删除树节点(拓扑排序/DFS) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題
      • 2.1 取巧解
      • 2.2 拓撲排序
      • 2.3 建圖+DFS

1. 題目

給你一棵以節點 0 為根節點的樹,定義如下:

節點的總數為 nodes 個; 第 i 個節點的值為 value[i] ; 第 i 個節點的父節點是 parent[i] 。 請你刪除節點值之和為 0 的每一棵子樹。

在完成所有刪除之后,返回樹中剩余節點的數目。

示例:

輸入:nodes = 7, parent = [-1,0,0,1,2,2,2], value = [1,-2,4,0,-2,-1,-1] 輸出:2提示: 1 <= nodes <= 10^4 -10^5 <= value[i] <= 10^5 parent.length == nodes parent[0] == -1 表示節點 0 是樹的根。

來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/delete-tree-nodes
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

2.1 取巧解

  • 數據很特殊,數據尾部為更深的節點,逆序遍歷即是自底向上
  • 該解法不通用
class Solution { public:int deleteTreeNodes(int nodes, vector<int>& parent, vector<int>& value) {int i, n = parent.size();vector<int> count(n,1);for(i = n-1; i >= 0; --i){if(value[i]==0)count[i] = 0;//自己子樹和為0,刪除節點if(parent[i] != -1){value[parent[i]] += value[i];//值加給父節點count[parent[i]] += count[i];//父節點底下不為0的節點個數}}return count[0];} };

60 ms 21.1 MB

2.2 拓撲排序

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/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的LeetCode 1273. 删除树节点(拓扑排序/DFS)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。