方法一:递归法。
方法二:迭代法。
[](()Submission
import java.util.LinkedList;
import com.lun.util.BinaryTree.TreeNode;
public class SumOfRootToLeafBinaryNumbers {
//方法一:递归法
public int sumRootToLeaf(TreeNode root) {
int[] sum = {0};
sumRootToLeaf(root, 0, sum);
return sum[0];
}
private void sumRootToLeaf(TreeNode node, int pathSum, int[] sum) {
if(node == null)
return;
pathSum = (pathSum << 1) | node.val;
if(node.left == null && node.right == null)
sum[0] += pathSum;
sumRootToLeaf(node.left, pathSum, sum);
sumRootToLeaf(node.right, pathSum, sum);
}
//方法二:迭代法
public int sumRootToLeaf2(TreeNode root) {
int sum = 0;
LinkedList<Object[]> stack = new LinkedList<>();
stack.push(new Object[] {root, 0});
while(!stack.isEmpty()) {
Object[] arr = stack.pop();
TreeNode node = (TreeNode)arr[0];
int pathSum = (int)arr[1];
pathSum = (pathSum << 1) | node.val;
if(node.left == null && node.right == null)
sum += pathSum;
if(node.right != null)
stack.push(new Object[] {node.right, pathSum});
if(node.left != null)
stack.push(new Object[] {node.left, pathSum});
}
return sum;
}
}
[](()Test
import static org.junit.Assert.*;
import org.junit.Test;
import com.lun.util.BinaryTree;
public class SumOfRootToLeafBinaryNumbersTest {
@Test
public void test() {
SumOfRootToLeafBinaryNumbers obj = new SumOfRootToLeafBinaryNumbers();
assertEquals(22, obj.sumRootToLeaf(BinaryTree.integers2BinaryTree(1, 0, 1, 0, 1, 0, 1)));
assertEquals(0, obj.sumRootToLeaf(BinaryTree.integers2BinaryTree(0)));
assertEquals(1, obj.sumRootToLeaf(BinaryTree.integers2BinaryTree(1)));
assertEquals(3, obj.sumRootToLeaf(BinaryTree.integers2BinaryTree(1, 1)));
}
@Test
public void test2() {
SumOfRootToLeafBinaryNumbers obj = new SumOfRootToLeafBinaryNumbers();
assertEquals(22, obj.sumRootToLeaf2(BinaryTree.integers2BinaryTree(1, 0, 1, 0, 1, 0, 1)));
assertEquals(0, obj.sumRootToLeaf2(BinaryTree.integers2BinaryTree(0)));
assertEquals(1, obj.sumRootToLeaf2(BinaryTree.integers2BinaryTree(1)));
assertEquals(3, obj.sumRootToLeaf2(BinaryTree.integers2BinaryTree(1, 1)));