把二叉搜索树转换为累加树—leetcode538
生活随笔
收集整理的這篇文章主要介紹了
把二叉搜索树转换为累加树—leetcode538
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
給定一個二叉搜索樹(Binary Search Tree),把它轉換成為累加樹(Greater Tree),使得每個節點的值是原來的節點值加上所有大于它的節點值之和。
例如:
輸入: 原始二叉搜索樹:
? ? ? ? ? ? ? 5
? ? ? ? ? ? / ? \
? ? ? ? ? ?2 ? ? 13
輸出: 轉換為累加樹:
? ? ? ? ? ? ?18
? ? ? ? ? ? / ? \
? ? ? ? ? 20 ? ? 13
?思路1:沒有看清題意是二叉搜索樹,尷尬,算了~先貼上沒有考慮搜索樹的笨方法把,先把數節點的值都拿出來,然后遍歷樹的節點,求比當前節點值大的數值和
?
/*** 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:vector<int> treeVal;TreeNode* convertBST(TreeNode* root) {if(root==NULL)return NULL;extractVal(root);int n = treeVal.size();resetVal(root,n);return root;}void resetVal(TreeNode* root,int n){if(root==NULL)return;resetVal(root->left,n);int sum = root->val;for(int i=0;i<n;++i){sum+=(treeVal[i]>root->val?treeVal[i]:0);}root->val = sum;resetVal(root->right,n);}void extractVal(TreeNode* root){if(root==NULL)return;extractVal(root->left);treeVal.push_back(root->val);extractVal(root->right);} };思路二:反序中序遍歷,即先遍歷右子樹,再根節點,后左節點,這樣充分利用二叉搜索樹特性,遍歷又大往小,一路求和即可
/*** 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 = 0;TreeNode* convertBST(TreeNode* root) {if(root==NULL)return NULL;convertBST(root->right);sum += root->val;root->val = sum;convertBST(root->left);return root;} };?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的把二叉搜索树转换为累加树—leetcode538的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汉明距离—leetcode461
- 下一篇: 二叉树的直径—leetcode543