Topic
- Stack
- Tree
Description
https://leetcode.com/problems/binary-tree-preorder-traversal/
Given the root
of a binary tree, return the preorder traversal of its nodes’ values.
Example 1:
Input: root = [1,null,2,3]
Output: [1,2,3]
Example 2:
Input: root = []
Output: []
Example 3:
Input: root = [1]
Output: [1]
Example 4:
Input: root = [1,2]
Output: [1,2]
Example 5:
Input: root = [1,null,2]
Output: [1,2]
Constraints:
- The number of nodes in the tree is in the range
[0, 100]
. -100 <= Node.val <= 100
Follow up: Recursive solution is trivial, could you do it iteratively?
Analysis
方法一:递归法。
方法二:迭代法。
Submission
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import com.lun.util.BinaryTree.TreeNode;
public class BinaryTreePreorderTraversal {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
preorderTraversal(root, result);
return result;
}
private void preorderTraversal(TreeNode root, List<Integer> result){
if(root == null) return;
result.add(root.val);
preorderTraversal(root.left, result);
preorderTraversal(root.right, result);
}
public List<Integer> preorderTraversal2(TreeNode root) {
List<Integer> result = new ArrayList<>();
LinkedList<TreeNode> stack = new LinkedList<>();
if(root != null) stack.push(root);
while(!stack.isEmpty()) {
TreeNode node = stack.pop();
result.add(node.val);
if(node.right != null)
stack.push(node.right);
if(node.left != null)
stack.push(node.left);
}
return result;
}
}
Test
import static org.junit.Assert.*;
import org.hamcrest.collection.IsEmptyCollection;
import org.hamcrest.collection.IsIterableContainingInOrder;
import org.junit.Test;
import com.lun.util.BinaryTree;
public class BinaryTreePreorderTraversalTest {
@Test
public void test() {
BinaryTreePreorderTraversal obj = new BinaryTreePreorderTraversal();
assertThat(obj.preorderTraversal(BinaryTree.integers2BinaryTree(1, null, 2, 3)), //
IsIterableContainingInOrder.contains(1, 2, 3));
assertThat(obj.preorderTraversal(null), IsEmptyCollection.empty());
assertThat(obj.preorderTraversal(BinaryTree.integers2BinaryTree(1)), //
IsIterableContainingInOrder.contains(1));
assertThat(obj.preorderTraversal(BinaryTree.integers2BinaryTree(1,2)), //
IsIterableContainingInOrder.contains(1,2));
assertThat(obj.preorderTraversal(BinaryTree.integers2BinaryTree(1,null,2)), //
IsIterableContainingInOrder.contains(1,2));
}
@Test
public void test2() {
BinaryTreePreorderTraversal obj = new BinaryTreePreorderTraversal();
assertThat(obj.preorderTraversal2(BinaryTree.integers2BinaryTree(1, null, 2, 3)), //
IsIterableContainingInOrder.contains(1, 2, 3));
assertThat(obj.preorderTraversal2(null), IsEmptyCollection.empty());
assertThat(obj.preorderTraversal2(BinaryTree.integers2BinaryTree(1)), //
IsIterableContainingInOrder.contains(1));
assertThat(obj.preorderTraversal2(BinaryTree.integers2BinaryTree(1,2)), //
IsIterableContainingInOrder.contains(1,2));
assertThat(obj.preorderTraversal2(BinaryTree.integers2BinaryTree(1,null,2)), //
IsIterableContainingInOrder.contains(1,2));
}
}