1、二叉树的前序遍历
-
分析
1、空树---->直接返回’
2、非空:将根结点入栈循环进行以下操作:
A.取栈顶元素—> cur peek()
B.遍历该元素 (因为取得栈顶元素始终是左子树,所i。。)
C.删除栈顶元素
D.如果cur的右子树存在,将右子树入栈
E.如果cur的左子树存在,将左子树入栈
方式一:
借助栈:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x; }
}
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
// 需要注意返回值类型,所以必须要先 new 出来
List<Integer> li = new LinkedList<Integer>();
// 如果是一棵空树
if (root == null) {
return li;
}
// 树非空,有两种方式,都需要借助栈或者集合中维护的堆栈
// 方式一: 将节点以右子树左子树的方式入栈
Stack<TreeNode> s = new Stack<TreeNode>();
s.push(root);
while(!s.isEmpty()) {
// 注意这个变量是不可省的,后面要通过他判断左右子树
TreeNode cur = s.peek();
li.add(cur.val);
s.pop