代碼隨想錄打卡第17天 513. 找樹左下角的值 112. 路徑總和 113. 路徑總和 II

513. 找樹左下角的值

題目鏈接:https://leetcode.cn/problems/find-bottom-left-tree-value/

算法思想:

求深度最深的那一層的最左邊的節(jié)點锚烦。那只要找到深度最深的那一層,然后取得遍歷到的第一個節(jié)點就行帝雇。

因此可以采用前序遍歷涮俄。

代碼

class Solution {

public:

? ? int final = INT_MIN;

? ? int final_deep = INT_MIN;

? ? void findbottom(TreeNode* node, int height)

? ? {

? ? ? ? if (node==NULL)

? ? ? ? ? ? return;

? ? ? ? if(node->left==NULL && node->right == NULL)

? ? ? ? {


? ? ? ? ? ? if(final_deep < height)

? ? ? ? ? ? {

? ? ? ? ? ? ? final = node->val;

? ? ? ? ? ? ? final_deep = height;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? findbottom(node->left, height+1);

? ? ? ? findbottom(node->right, height+1);

? ? }

? ? int findBottomLeftValue(TreeNode* root) {

? ? ? ? //使用前序遍歷

? ? ? ? int height = 0;

? ? ? ? findbottom(root, height);

? ? ? ? return final;

? ? }

};

112. 路徑總和

題目鏈接:

https://leetcode.cn/problems/path-sum/

算法思想:

前序遍歷(其實沒有前,因為沒有對中節(jié)點做什么處理)

首先需要確定遞歸返回的條件:

遍歷到葉子節(jié)點的時候判斷是否滿足條件尸闸,滿足返回true彻亲,否則返回false

代碼:

class Solution {

public:

? ? bool haspath(TreeNode* root, int target, int sum)

? ? {

? ? ? ? if(root==NULL)

? ? ? ? ? ? return false;

? ? ? ? if(root->left==NULL&&root->right==NULL && sum+root->val == target)

? ? ? ? ? ? return true;

? ? ? ? bool left = haspath(root->left, target, sum+root->val);

? ? ? ? if(left)

? ? ? ? ? ? return true;

? ? ? ? bool right = haspath(root->right, target, sum+root->val);

? ? ? ? if(right)

? ? ? ? ? ? return true;


? ? ? ? return false;

? ? }

? ? bool hasPathSum(TreeNode* root, int targetSum) {

? ? ? ? return haspath(root, targetSum, 0);

? ? }

};

113. 路徑總和 II

題目鏈接:

https://leetcode.cn/problems/path-sum-ii/

算法思想:

使用回溯法解決:回溯法是在遞歸函數(shù)的下一行寫的。注意回溯法吮廉,要有進(jìn)有出苞尝。

加上了之后,要減回去宦芦。

class Solution {

public:

? ? void path(TreeNode* root, int targetSum, vector<vector<int>>& res, vector<int>& cur)

? ? {

? ? ? ? if(root==NULL)

? ? ? ? ? ? return ;

? ? ? ? cout<<"target:"<<targetSum<<endl;

? ? ? ? if(root->left==NULL&&root->right==NULL&&targetSum==root->val)

? ? ? ? {

? ? ? ? ? ? cur.push_back(root->val);

? ? ? ? ? ? res.push_back(cur);

? ? ? ? ? ? cur.pop_back();

? ? ? ? ? ? return;

? ? ? ? }

? ? ? ? if(root->left==NULL&&root->right==NULL&&targetSum==root->val)

? ? ? ? {

? ? ? ? ? ? return;

? ? ? ? }

? ? ? ? if(root->left)

? ? ? ? {

? ? ? ? ? ? cur.push_back(root->val);

? ? ? ? ? ? targetSum = targetSum-root->val;

? ? ? ? ? ? // cout<<"left-sum:"<<targetSum<<endl;

? ? ? ? ? ? path(root->left, targetSum, res, cur);

? ? ? ? ? ? targetSum = targetSum + root->val;

? ? ? ? ? ? cur.pop_back();

? ? ? ? }

? ? ? ? if(root->right)

? ? ? ? {

? ? ? ? ? ? cur.push_back(root->val);

? ? ? ? ? ? targetSum = targetSum-root->val;

? ? ? ? ? ? // cout<<"right-sum:"<<targetSum<<endl;

? ? ? ? ? ? path(root->right, targetSum, res, cur);

? ? ? ? ? ? targetSum = targetSum + root->val;

? ? ? ? ? ? cur.pop_back();

? ? ? ? }

? ? ? ? return;

? ? }

? ? vector<vector<int>> pathSum(TreeNode* root, int targetSum) {

? ? ? ? vector<vector<int> > result;

? ? ? ? vector<int> cur;

? ? ? ? path(root, targetSum, result, cur);

? ? ? ? return result;


? ? }

};

106.從中序與后序遍歷序列構(gòu)造二叉樹

題目鏈接:

https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/

算法思想:

根據(jù)后續(xù)遍歷的結(jié)果確定根節(jié)點宙址,根據(jù)根節(jié)點確定,從中序遍歷中確定左右子樹的切割點踪旷,從而確定左右子樹的大小曼氛。再使用左子樹的大小,去后續(xù)遍歷中找到左右子樹的切割點令野,進(jìn)行遞歸舀患。

/**

* 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:

? ? TreeNode* buildtree(vector<int>& inorder, int in_start, int in_end, vector<int>& postorder, int post_start, int post_end)

? ? {

? ? ? ? // cout<<"in_start:"<<in_start<<" in_end:"<<in_end<<" post_start"<<post_start<<" post_end"<<post_end<<endl;

? ? ? ? if(post_end<post_start)

? ? ? ? {?

? ? ? ? ? ? // cout<<"in if: post_start"<<post_start<<" post_end"<<post_end<<endl;

? ? ? ? ? ? return NULL;

? ? ? ? }


? ? ? ? int now = postorder[post_end];

? ? ? ? // cout<<"now:"<<now<<endl;

? ? ? ? TreeNode* node = new TreeNode(now);

? ? ? ? if(in_end==in_start)

? ? ? ? ? ? return node;

? ? ? ? int i=in_start; //

? ? ? ? //根據(jù)后續(xù)遍歷確定根節(jié)點的值,去中序遍歷的數(shù)組中尋找左右子樹的分割點

? ? ? ? for(i=in_start;i<=in_end;i++)

? ? ? ? {

? ? ? ? ? ? // cout<<"while i:"<<i<<endl;

? ? ? ? ? ? if(now == inorder[i]) //找到了中序遍歷的分割點

? ? ? ? ? ? {

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? // cout<<"i:"<<i<<endl;

? ? ? ? int left_size = i-in_start;


? ? ? ? node->left = buildtree(inorder, in_start,i-1,postorder,post_start,post_start+left_size-1);

? ? ? ? node->right = buildtree(inorder,i+1,in_end, postorder, post_start+left_size,post_end-1);

? ? ? ? // cout<<"node->val:"<<node->val<<endl;

? ? ? ? return node;



? ? }

? ? TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {

? ? ? ? return buildtree(inorder,0,inorder.size()-1, postorder,0,postorder.size()-1);

? ? }

};

105. 從前序與中序遍歷序列構(gòu)造二叉樹

題目鏈接:

https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

算法思想:

根據(jù)前序遍歷確定根節(jié)點气破,去中序遍歷中尋找中序遍歷的切割點聊浅,從而確定左右子樹的條件。

要明確循環(huán)終止的條件:根節(jié)點為空或者走到葉子節(jié)點時。

/**

* 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:

? ? TreeNode* buildtree(vector<int>& preorder, int pre_s, int pre_e, vector<int>& inorder, int in_s, int in_e)

? ? {

? ? ? ? if(pre_e<pre_s)

? ? ? ? ? ? return NULL;

? ? ? ? TreeNode* node = new TreeNode(preorder[pre_s]);

? ? ? ? if(pre_e==pre_s)

? ? ? ? {

? ? ? ? ? ? return node;

? ? ? ? }

? ? ? ? //根據(jù)中序遍歷低匙,確定開始和結(jié)束

? ? ? ? int i;

? ? ? ? for(i=in_s;i<in_e;i++) //找到了中序遍歷的切割點

? ? ? ? {

? ? ? ? ? ? if(preorder[pre_s]==inorder[i])

? ? ? ? ? ? ? ? break;

? ? ? ? }

? ? ? ? //確定前序遍歷的左葉子節(jié)點的結(jié)束為止

? ? ? ? int preorder_left_start = pre_s+1;

? ? ? ? int preorder_left_end = pre_s+(i-in_s);

? ? ? ? int preorder_right_start = pre_s+(i-in_s)+1;

? ? ? ? int preorder_right_end = pre_e;

? ? ? ? // 中序遍歷的開始和結(jié)束

? ? ? ? int inorder_left_start = in_s;

? ? ? ? int inorder_left_end = i-1;

? ? ? ? int inorder_right_start = i+1;

? ? ? ? int inorder_right_end = in_e;

? ? ? ? node->left = buildtree(preorder, preorder_left_start,preorder_left_end, inorder,inorder_left_start,inorder_left_end);

? ? ? ? node->right = buildtree(preorder,preorder_right_start,preorder_right_end, inorder,inorder_right_start,inorder_right_end);

? ? ? ? return node;

? ? }

? ? TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {

? ? ? ? return buildtree(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1);

? ? }

};

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旷痕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子顽冶,更是在濱河造成了極大的恐慌欺抗,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件强重,死亡現(xiàn)場離奇詭異绞呈,居然都是意外死亡,警方通過查閱死者的電腦和手機间景,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門佃声,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人倘要,你說我怎么就攤上這事圾亏。” “怎么了封拧?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵志鹃,是天一觀的道長。 經(jīng)常有香客問我哮缺,道長弄跌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任尝苇,我火速辦了婚禮铛只,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘糠溜。我一直安慰自己淳玩,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布非竿。 她就那樣靜靜地躺著蜕着,像睡著了一般。 火紅的嫁衣襯著肌膚如雪红柱。 梳的紋絲不亂的頭發(fā)上承匣,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音锤悄,去河邊找鬼韧骗。 笑死,一個胖子當(dāng)著我的面吹牛零聚,可吹牛的內(nèi)容都是我干的袍暴。 我是一名探鬼主播些侍,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼政模!你這毒婦竟也來了岗宣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤淋样,失蹤者是張志新(化名)和其女友劉穎耗式,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體习蓬,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡纽什,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了躲叼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡企巢,死狀恐怖枫慷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浪规,我是刑警寧澤或听,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站笋婿,受9級特大地震影響誉裆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缸濒,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洗鸵,春花似錦尊残、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至啸澡,卻和暖如春袖订,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嗅虏。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工洛姑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人旋恼。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓吏口,卻偏偏與公主長得像奄容,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子产徊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容