leetcode演算法題 pro538-累加樹
阿新 • • 發佈:2020-09-21
LeetCode pro538
leetcode的一道簡單演算法題,是關於累加樹的,要求把二叉搜尋樹轉換為累加樹
題幹:
給定一個二叉搜尋樹(Binary Search Tree),把它轉換成為累加樹(Greater Tree),使得每個節點的值是原來的節點值加上所有大於它的節點值之和。
例如:
輸入: 原始二叉搜尋樹:
5
/
2 13
輸出: 轉換為累加樹:
18
/
20 13
關於二叉搜尋樹
二叉搜尋樹一般使用連結串列結構為底層結構,其中每一個結點就是一個物件。每個結點除了存的值之外,還包含屬性lchild、rchild和parent,分別指向結點的左孩子、右孩子和雙親(父結點)。如果某個孩子結點或父結點不存在,則相應屬性的值為空。二叉搜尋樹的性質:設x是二叉搜尋樹中的一個結點。如果y是x左子樹中的一個結點,那麼y.key≤x.key。如果y是x右子樹中的一個結點,那麼y.key≥x.key。
在二叉搜尋樹中:
1.若任意結點的左子樹不空,則左子樹上所有結點的值均不大於它的根結點的值。
2. 若任意結點的右子樹不空,則右子樹上所有結點的值均不小於它的根結點的值。
3.任意結點的左、右子樹也分別為二叉搜尋樹。
剛開始做這題,想複雜了,後來看了別人的評論之後,明白了用中序反序序列遍歷累加可以很容易做出來。
就是按照右節點根節點左節點的順序來累加,舉個例子,相當於一個有序陣列[1,2,3]從右邊開始累加,變成[6,5,3]
實現程式碼:
class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } class Solution { public int sum = 0; public TreeNode convertBST(TreeNode root) { if(root != null){ convertBST(root.right);//優先遍歷右節點字數,將其累加 sum += root.val;//其次遍歷根節點 root.val = sum; convertBST(root.left);//最後累加左節點 } return root; } }
輸出結果:
題目轉載於leetcode,地址:https://leetcode-cn.com/problems/convert-bst-to-greater-tree/