今天分享一個LeetCode題,題號是1038,標題是:從二分搜索樹到更大和數。
題目描述
給出二叉搜索樹的根節點,該二叉樹的節點值各不相同,修改二叉樹,使每個節點 node 的新值等於原樹中大於或等於 node.val 的值之和。
提醒一下,二叉搜索樹滿足下列約束條件:
1)節點的左子樹僅包含鍵小於節點鍵的節點。
2)節點的右子樹僅包含鍵大於節點鍵的節點。
3)左右子樹也必須是二叉搜索樹。
示例:
輸入:[4, 1, 6, 0, 2, 5, 7, null, null, null, 3, null, null, null, 8]
輸出:[30, 36, 21, 36, 35, 26, 15, null, null, null, 33, null, null, null, 8]
解題
光看題目描述,好像是看不到這題到底是什么意思,我反而是先看示例圖就看懂了,你說氣不氣。
回歸一下解題思路,這道題跟二分搜索樹有關,之前也介紹過二分搜索樹的遍歷方式,如果需要回顧一下二分搜索數可以點擊一下 傳送 ,記得回城看題啊!
如果我們了解二分搜索樹的中序遍歷,求解這道題就變得非常容易。中序遍歷是從左遞歸開始的,再進行訪問這個節點,然后進行右遞歸,遞歸終止條件是這個節點為空。
看上面示例圖,通過中序遍歷可以得到有序數組:[0,1,2,3,4,5,6,7,8],如果左右遞歸調換的話也可以得到倒序。
求解這道題正是通過右遞歸 -> 訪問節點 -> 左遞歸,得到每一個節點的和數。執行動畫如下視頻:
動畫
進行右遞歸時,一直到該節點為空,直接返回和數,和數起始為0;返回上一個節點,將當前和數與節點的值相加為新的和數,並且該節點賦值為新的和數;然后進行左遞歸進行下一個節點。
我們可以先設定一個和數int sum = 0;
,你可以把它放到全局變量,也可以把它放到局部變量。放到局部變量時可以把它作為參數貫穿所有的節點。代碼如下:
Code
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode bstToGst(TreeNode root) {
if(root == null) return null;
int sum = 0;
bstToGstInt(root,sum);
return root;
}
public int bstToGstInt(TreeNode node,int sum){
if(node == null) return sum;
sum = bstToGstInt(node.right,sum);
sum += node.val;
node.val = sum;
sum = bstToGstInt(node.left,sum);
return sum;
}
}
喜歡本文的朋友,歡迎關注公眾號「算法無遺策」,收看更多精彩內容