摘要:每日一題二叉樹(shù)的坡度鏈接二叉樹(shù)的坡度題目分析簡(jiǎn)單的問(wèn)題。首先明確思路,我們需要遍歷每一個(gè)點(diǎn),然后求出該點(diǎn)左右子樹(shù)的值的總和,然后做差,答案累計(jì)這個(gè)差值即可。
簡(jiǎn)單的dfs問(wèn)題。首先明確思路,我們需要遍歷每一個(gè)點(diǎn),然后求出該點(diǎn)左右子樹(shù)的值的總和,然后做差,答案累計(jì)這個(gè)差值即可。那么問(wèn)題就轉(zhuǎn)化到求每個(gè)節(jié)點(diǎn)左右子樹(shù)值的綜合上面,同樣是一個(gè)dfs問(wèn)題,但是這個(gè)問(wèn)題有一個(gè)優(yōu)化,我們?cè)谥蟮拇a部分進(jìn)行詳細(xì)的分析。
C++
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */class Solution {public: int res = 0; int findTilt(TreeNode* root) { // 首先對(duì)節(jié)點(diǎn)判空,如果是空,那么結(jié)果為0,直接返回即可. if(root == nullptr) return res; // 遍歷整個(gè)樹(shù) dfs(root); // 返回結(jié)果值 return res; } void dfs(TreeNode* root) { // 分別記錄左右子樹(shù)值的總和,初始值為0 int l = 0, r = 0; // 如果存在左子樹(shù)就更新左子樹(shù)值的總和 if(root->left) l = sum(root->left); // 如果存在右子樹(shù)就更新右子樹(shù)值的總和 if(root->right) r = sum(root->right); // 答案記錄一下差值 res += abs(l - r); // 如果存在左節(jié)點(diǎn)就計(jì)算左節(jié)點(diǎn)的坡度 if(root->left) dfs(root->left); // 如果存在右節(jié)點(diǎn)就計(jì)算右節(jié)點(diǎn)的坡度 if(root->right) dfs(root->right); } int sum(TreeNode* root) { // 計(jì)算當(dāng)前節(jié)點(diǎn)值的總和 // 左子樹(shù)的值 int l = 0; // 右子樹(shù)的值 int r = 0; // 如果存在左子樹(shù)就更新左子樹(shù)的值(遞歸更新) if(root->left) l = sum(root->left); // 如果存在右子樹(shù)就更新右子樹(shù)的值(遞歸更新) if(root->right) r = sum(root->right); // 返回當(dāng)前節(jié)點(diǎn)值的總和 return root->val + l + r; }};
C++
優(yōu)化
我們經(jīng)過(guò)簡(jiǎn)單的思考就可以發(fā)現(xiàn),解法一實(shí)在是太繁瑣了,我們每遍歷一個(gè)點(diǎn),就需要查詢(xún)以當(dāng)前結(jié)點(diǎn)為跟的整個(gè)樹(shù),其中存在大量的重復(fù),那么是否可以?xún)?yōu)化這個(gè)過(guò)程呢?我們仔細(xì)觀察,其實(shí)在計(jì)算差值的時(shí)候,我們也是遍歷了整個(gè)樹(shù),那么我們可以可以邊更新邊遍歷,我們先計(jì)算底層的值,然后用底層的值來(lái)更新更高一層的值,顯然是可以的。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */class Solution { int res = 0;public: int findTilt(TreeNode* root) { // 如果根節(jié)點(diǎn)非空就遞歸遍歷樹(shù) if(root) dfs(root); // 返回結(jié)果 return res; } // 邊計(jì)算差值邊求當(dāng)前節(jié)點(diǎn)的總和,從底層開(kāi)始向上遍歷 int dfs(TreeNode* root) { // 如果是葉子,就返回當(dāng)前值 if(!root->left and !root->right) return root->val; // 計(jì)算當(dāng)前當(dāng)前節(jié)點(diǎn)的左右子樹(shù)總和,默認(rèn)值為0 int l = 0, r = 0; // 如果存在左子樹(shù)就更新l,此時(shí),先去計(jì)算底層的值,向下遞歸 if(root->left) l = dfs(root->left); // 如果存在右子樹(shù)就更新r,此時(shí),先去計(jì)算底層的值,向下遞歸 if(root->right) r = dfs(root->right); // 記錄下差值 res += abs(l - r); // 返回當(dāng)前節(jié)點(diǎn)的值的總和 return l + r + root->val; }};
Java
class Solution { int ans = 0; public int findTilt(TreeNode root) { dfs(root); return ans; } public int dfs(TreeNode node) { if (node == null) { return 0; } int sumLeft = dfs(node.left); int sumRight = dfs(node.right); ans += Math.abs(sumLeft - sumRight); return sumLeft + sumRight + node.val; }}作者:LeetCode-Solution
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/123947.html
摘要:解題思路一道非常簡(jiǎn)單的題目,不能被繞進(jìn)去,首先要把題目讀明白,左右坡度差本質(zhì)上是左右子樹(shù)和之差,那么問(wèn)題就簡(jiǎn)單了,每次,返回的就是當(dāng)前所在子樹(shù)之和,更新坡度差的話就是當(dāng)前左右子樹(shù)之差,這兩個(gè)要分開(kāi)來(lái)計(jì)算,代碼如下 ...
摘要:在線網(wǎng)站地址我的微信公眾號(hào)完整題目列表從年月日起,每天更新一題,順序從易到難,目前已更新個(gè)題。這是項(xiàng)目地址歡迎一起交流學(xué)習(xí)。 這篇文章記錄我練習(xí)的 LeetCode 題目,語(yǔ)言 JavaScript。 在線網(wǎng)站:https://cattle.w3fun.com GitHub 地址:https://github.com/swpuLeo/ca...我的微信公眾號(hào): showImg(htt...
摘要:每日一題平衡二叉樹(shù)鏈接平衡二叉樹(shù)題目分析遍歷樹(shù),然后每次判斷樹(shù)的左右兩個(gè)子樹(shù)的差值即可。 leetcode每日一題-110:平衡二叉樹(shù) 鏈接 平衡二叉樹(shù) 題目 ...
摘要:每日一題叉樹(shù)的最大深度鏈接叉樹(shù)的最大深度題目分析簡(jiǎn)單的搜索題目。只需要從根節(jié)點(diǎn)開(kāi)始一下整個(gè)叉樹(shù)就可以得到答案了。主要是對(duì)要理解和掌握叉樹(shù)的遍歷。代碼作者作者 lee...
摘要:有效二叉搜索樹(shù)定義如下節(jié)點(diǎn)的左子樹(shù)只包含小于當(dāng)前節(jié)點(diǎn)的數(shù)。所有左子樹(shù)和右子樹(shù)自身必須也是二叉搜索樹(shù)。而我們二叉搜索樹(shù)保證了左子樹(shù)的節(jié)點(diǎn)的值均小于根節(jié)點(diǎn)的值,根節(jié)點(diǎn)的值均小于右子樹(shù)的值,因此中序遍歷以后得到的序列一定是升序序列。 ...
閱讀 3426·2021-11-25 09:43
閱讀 3473·2021-11-19 09:40
閱讀 2480·2021-10-14 09:48
閱讀 1297·2021-09-09 11:39
閱讀 1935·2019-08-30 15:54
閱讀 2833·2019-08-30 15:44
閱讀 2006·2019-08-29 13:12
閱讀 1552·2019-08-29 12:59