LeetCode - Medium - 538

Input: root = [4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]

Output: [30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

Example 2:

Input: root = [0,null,1]

Output: [1,null,1]

Example 3:

Input: root = [1,0,2]

Output: [3,3,2]

Example 4:

Input: root = [3,2,4,1]

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


import java.util.LinkedList;

import com.lun.util.BinaryTree.TreeNode;

public class ConvertBSTToGreaterTree {

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

public TreeNode convertBST(TreeNode root) {

dfs(root, new int[] {0});

return root;

}

private void dfs(TreeNode node, int[] sum) {

if(node == null)

return;

dfs(node.right, sum);

sum[0] = node.val += sum[0];

dfs(node.left, sum);

}

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

public TreeNode convertBST2(TreeNode root) {

TreeNode p = root;

LinkedList stack = new LinkedList<>();

int sum = 0;

while(!stack.isEmpty() || p != null) {

if(p != null) {

stack.push§;

p = p.right;

}else {

TreeNode node = stack.pop();

sum = node.val += sum;

p = node.left;

}

}

return root;

}

}

Test


import static org.junit.Assert.*;

import org.junit.Test;

import com.lun.util.BinaryTree;

import com.lun.util.BinaryTree.TreeNode;

public class ConvertBSTToGreaterTreeTest {

@Test

public void test() {

ConvertBSTToGreaterTree obj = new ConvertBSTToGreaterTree();

TreeNode root1 = BinaryTree.integers2BinaryTree(4,1,6,0,2,5,7,null,null,null,3,null,null,null,8);

TreeNode expected1 = BinaryTree.integers2BinaryTree(30,36,21,36,35,26,15,null,null,null,33,null,null,null,8);

assertTrue(BinaryTree.equals(obj.convertBST(root1), expected1));

TreeNode root2 = BinaryTree.integers2BinaryTree(0,null,1);

TreeNode expected2 = BinaryTree.integers2BinaryTree(1,null,1);

assertTrue(BinaryTree.equals(obj.convertBST(root2), expected2));

TreeNode root3 = BinaryTree.integers2BinaryTree(1,0,2);

TreeNode expected3 = BinaryTree.integers2BinaryTree(3,3,2);

assertTrue(BinaryTree.equals(obj.convertBST(root3), expected3));

TreeNode root4 = BinaryTree.integers2BinaryTree(3,2,4,1);

TreeNode expected4 = BinaryTree.integers2BinaryTree(7,9,4,10);

assertTrue(BinaryTree.equals(obj.convertBST(root4), expected4));

}

@Test

public void test2() {

ConvertBSTToGreaterTree obj = new ConvertBSTToGreaterTree();

TreeNode root1 = BinaryTree.integers2BinaryTree(4,1,6,0,2,5,7,null,null,null,3,null,null,null,8);

TreeNode expected1 = BinaryTree.integers2BinaryTree(30,36,21,36,35,26,15,null,null,null,33,null,null,null,8);

assertTrue(BinaryTree.equals(obj.convertBST2(root1), expected1));

TreeNode root2 = BinaryTree.integers2BinaryTree(0,null,1);

TreeNode expected2 = BinaryTree.integers2BinaryTree(1,null,1);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值