LeetCode - Medium - 538. Convert BST to Greater Tree

超、凢脫俗 2022-10-05 05:42 67阅读 0赞

Topic

  • Tree
  • Depth-first Search
  • Binary Search Tree
  • Recursion

Description

https://leetcode.com/problems/convert-bst-to-greater-tree/

Given the root of a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original BST is changed to the original key plus sum of all keys greater than the original key in BST.

As a reminder, a binary search tree is a tree that satisfies these constraints:

  • The left subtree of a node contains only nodes with keys less than the node’s key.
  • The right subtree of a node contains only nodes with keys greater than the node’s key.
  • Both the left and right subtrees must also be binary search trees.

Note: This question is the same as 1038: https://leetcode.com/problems/binary-search-tree-to-greater-sum-tree/

Example 1:

5b5e6e441187c9ffb7a73fcf797e08a0.png

  1. Input: root = [4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
  2. Output: [30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

Example 2:

  1. Input: root = [0,null,1]
  2. Output: [1,null,1]

Example 3:

  1. Input: root = [1,0,2]
  2. Output: [3,3,2]

Example 4:

  1. Input: root = [3,2,4,1]
  2. Output: [7,9,4,10]

Constraints:

  • The number of nodes in the tree is in the range [ 0 , 1 0 4 ] [0, 10^4] [0,104].
  • − 1 0 4 < = N o d e . v a l < = 1 0 4 -10^4 <= Node.val <= 10^4 −104<=Node.val<=104
  • All the values in the tree are unique.
  • root is guaranteed to be a valid binary search tree.

Analysis

方法一:中序遍历模式的递归版

方法二:中序遍历模式的迭代版

Submission

  1. import java.util.LinkedList;
  2. import com.lun.util.BinaryTree.TreeNode;
  3. public class ConvertBSTToGreaterTree {
  4. //方法一:中序遍历模式的递归版
  5. public TreeNode convertBST(TreeNode root) {
  6. dfs(root, new int[] { 0});
  7. return root;
  8. }
  9. private void dfs(TreeNode node, int[] sum) {
  10. if(node == null)
  11. return;
  12. dfs(node.right, sum);
  13. sum[0] = node.val += sum[0];
  14. dfs(node.left, sum);
  15. }
  16. //方法二:中序遍历模式的迭代版
  17. public TreeNode convertBST2(TreeNode root) {
  18. TreeNode p = root;
  19. LinkedList<TreeNode> stack = new LinkedList<>();
  20. int sum = 0;
  21. while(!stack.isEmpty() || p != null) {
  22. if(p != null) {
  23. stack.push(p);
  24. p = p.right;
  25. }else {
  26. TreeNode node = stack.pop();
  27. sum = node.val += sum;
  28. p = node.left;
  29. }
  30. }
  31. return root;
  32. }
  33. }

Test

  1. import static org.junit.Assert.*;
  2. import org.junit.Test;
  3. import com.lun.util.BinaryTree;
  4. import com.lun.util.BinaryTree.TreeNode;
  5. public class ConvertBSTToGreaterTreeTest {
  6. @Test
  7. public void test() {
  8. ConvertBSTToGreaterTree obj = new ConvertBSTToGreaterTree();
  9. TreeNode root1 = BinaryTree.integers2BinaryTree(4,1,6,0,2,5,7,null,null,null,3,null,null,null,8);
  10. TreeNode expected1 = BinaryTree.integers2BinaryTree(30,36,21,36,35,26,15,null,null,null,33,null,null,null,8);
  11. assertTrue(BinaryTree.equals(obj.convertBST(root1), expected1));
  12. TreeNode root2 = BinaryTree.integers2BinaryTree(0,null,1);
  13. TreeNode expected2 = BinaryTree.integers2BinaryTree(1,null,1);
  14. assertTrue(BinaryTree.equals(obj.convertBST(root2), expected2));
  15. TreeNode root3 = BinaryTree.integers2BinaryTree(1,0,2);
  16. TreeNode expected3 = BinaryTree.integers2BinaryTree(3,3,2);
  17. assertTrue(BinaryTree.equals(obj.convertBST(root3), expected3));
  18. TreeNode root4 = BinaryTree.integers2BinaryTree(3,2,4,1);
  19. TreeNode expected4 = BinaryTree.integers2BinaryTree(7,9,4,10);
  20. assertTrue(BinaryTree.equals(obj.convertBST(root4), expected4));
  21. }
  22. @Test
  23. public void test2() {
  24. ConvertBSTToGreaterTree obj = new ConvertBSTToGreaterTree();
  25. TreeNode root1 = BinaryTree.integers2BinaryTree(4,1,6,0,2,5,7,null,null,null,3,null,null,null,8);
  26. TreeNode expected1 = BinaryTree.integers2BinaryTree(30,36,21,36,35,26,15,null,null,null,33,null,null,null,8);
  27. assertTrue(BinaryTree.equals(obj.convertBST2(root1), expected1));
  28. TreeNode root2 = BinaryTree.integers2BinaryTree(0,null,1);
  29. TreeNode expected2 = BinaryTree.integers2BinaryTree(1,null,1);
  30. assertTrue(BinaryTree.equals(obj.convertBST2(root2), expected2));
  31. TreeNode root3 = BinaryTree.integers2BinaryTree(1,0,2);
  32. TreeNode expected3 = BinaryTree.integers2BinaryTree(3,3,2);
  33. assertTrue(BinaryTree.equals(obj.convertBST2(root3), expected3));
  34. TreeNode root4 = BinaryTree.integers2BinaryTree(3,2,4,1);
  35. TreeNode expected4 = BinaryTree.integers2BinaryTree(7,9,4,10);
  36. assertTrue(BinaryTree.equals(obj.convertBST2(root4), expected4));
  37. }
  38. }

发表评论

表情:
评论列表 (有 0 条评论,67人围观)

还没有评论,来说两句吧...

相关阅读