1. 程式人生 > 實用技巧 >leetcode演算法題 pro538-累加樹

leetcode演算法題 pro538-累加樹

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/