1. 程式人生 > 其它 >【14】求根到葉子節點數字之和(LeetCode 129)

【14】求根到葉子節點數字之和(LeetCode 129)

技術標籤:LeetCode刷題筆記二叉樹演算法資料結構leetcodec++

問題描述

求根到葉子節點數字之和

給定一個二叉樹,它的每個結點都存放一個 0-9 的數字,每條從根到葉子節點的路徑都代表一個數字。

例如,從根到葉子節點路徑 1->2->3 代表數字 123。

計算從根到葉子節點生成的所有數字之和。

說明: 葉子節點是指沒有子節點的節點。

示例:
在這裡插入圖片描述

思考過程

除了葉子節點能確定一定是個位以外其他節點都不能確定處於哪一位,因此必須從葉子節點開始往上算,因此我想到了前幾天做的平衡二叉樹的自底向上的做法,用一個引數times來記錄目前節點的位數,但是經過思考和嘗試,發現甚至連最初傳進去的times應該設定為幾都不知道;於是又換了一種思路,也許可以返回在第幾層,用“層數”作為10的指數來與val相乘再相加,其實也是自底向上的思想,若為葉子節點則返回第0層,之後每向上返回一層層數就加一。感覺思想上是可以的,不過用程式碼實現的時候還是遇到了問題。

最後看的官方題解,深度優先搜尋的方法,演算法思想是:

用一個變數presum記錄從上往下遍歷時得到的和,每向下一層,presum就乘以10在加上當前節點的val,若遇到葉子節點則可返回sum,否則返回左子樹與右子樹相加的結果。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution { public: int Sum(TreeNode* root,int presum){ if(root==NULL) return 0; int sum=presum*10+root->val; if(root->left==NULL&&root->right==NULL){ return sum; }else{ return Sum(root->left,sum)+Sum(root-
>right,sum); } } int sumNumbers(TreeNode* root) { return Sum(root,0); } };

心得

看了官方的題解之後我覺得還是沒能熟練運用遞迴,甚至沒有完全理解運用遞迴的思想,感覺做遞迴的感覺和做動態規劃的感覺有點像,如果能想到突破點,那麼思想和程式碼都比較簡單,但如果想不到解題的突破點,還是難頂。