Skip to content

Commit 20967ca

Browse files
committed
#144 二叉树前序遍历,递归版本和栈迭代版本
1 parent a8de427 commit 20967ca

File tree

2 files changed

+103
-0
lines changed

2 files changed

+103
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package tree;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.Stack;
6+
7+
/**
8+
* @author alis
9+
* @date 2019/10/27 12:55 AM
10+
* @description
11+
*/
12+
public class LC_144_PreOrderTraversal {
13+
14+
15+
/**
16+
* 二叉树前序遍历:根 左 右
17+
* 递归
18+
*/
19+
public List<Integer> preOrderTraversalRecur(tree.TreeNode root) {
20+
List<Integer> nums = new ArrayList<>();
21+
// terminator
22+
if (null == root) return nums;
23+
24+
// process
25+
nums.add(root.val);
26+
27+
// drill down
28+
if (root.left != null) nums.addAll(preOrderTraversalRecur(root.left));
29+
if (root.right != null) nums.addAll(preOrderTraversalRecur(root.right));
30+
31+
// reverse states
32+
33+
return nums;
34+
}
35+
36+
/**
37+
* 栈迭代 前序遍历二叉树
38+
* 核心思想:先将根结点入栈,在while循环中取出,如果子结点不为空,先入栈右结点,再入栈左结点,
39+
* 继续while循环,输出根结点的值
40+
*/
41+
public List<Integer> preOrderTraversalStack(TreeNode root) {
42+
List<Integer> nums = new ArrayList<>();
43+
if (null == root) return nums;
44+
Stack<TreeNode> stack = new Stack<>();
45+
stack.add(root);
46+
while (!stack.isEmpty()) {
47+
TreeNode node = stack.pop();
48+
nums.add(node.val);
49+
if (node.right != null) {
50+
stack.push(node.right);
51+
}
52+
if (node.left != null) {
53+
stack.push(node.left);
54+
}
55+
}
56+
return nums;
57+
}
58+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package tree;
2+
3+
import org.junit.Test;
4+
5+
import java.util.Arrays;
6+
import java.util.List;
7+
8+
import static org.hamcrest.Matchers.is;
9+
import static org.junit.Assert.assertThat;
10+
11+
/**
12+
* @author alis
13+
* @date 2019/10/27 12:53 AM
14+
* @description
15+
*/
16+
public class LC_144_PreOrderTraversalTest {
17+
18+
private LC_144_PreOrderTraversal preOrderTraversal = new LC_144_PreOrderTraversal();
19+
20+
@Test
21+
public void preOrderTraversalTest() {
22+
TreeNode root = new TreeNode(1);
23+
TreeNode node2 = new TreeNode(2);
24+
TreeNode node3 = new TreeNode(3);
25+
node2.left = node3;
26+
root.right = node2;
27+
List<Integer> expected = Arrays.asList(1, 2, 3);
28+
List<Integer> res = preOrderTraversal.preOrderTraversalRecur(root);
29+
assertThat(res, is(expected));
30+
}
31+
32+
@Test
33+
public void preOrderTraversalStackTest() {
34+
TreeNode root = new TreeNode(1);
35+
TreeNode node2 = new TreeNode(2);
36+
TreeNode node3 = new TreeNode(3);
37+
node2.left = node3;
38+
root.right = node2;
39+
List<Integer> expected = Arrays.asList(1, 2, 3);
40+
List<Integer> res = preOrderTraversal.preOrderTraversalStack(root);
41+
assertThat(res, is(expected));
42+
}
43+
44+
45+
}

0 commit comments

Comments
 (0)