1. 二叉树的前序遍历
给你二叉树的根节点 root ,返回它节点值的前序遍历。
输入:{1,#,2,3}
返回值:[1,2,3]
思路1:二叉树的递归,则是将某个节点的左子树、右子树看成一颗完整的树,那么对于子树的访问或者操作就是对于原树的访问或者操作的子问题,因此可以自我调用函数不断进入子树。
- 终止条件: 当子问题到达叶子节点后,后一个不管左右都是空,因此遇到空节点就返回。
- 返回值: 每次处理完子问题后,就是将子问题访问过的元素返回,依次存入了数组中。
- 子问题: 每个子问题优先访问这棵子树的根节点,然后递归进入左子树和右子树。
思路2:使用辅助栈来存放每次遍历的根节点,弹出栈顶元素,然后判断该元素是否有左右子节点,有的话的加入栈中,优先加入右节点。同样也要先判断树是否为空,空树不遍历。
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class Main {
/**
* 递归方法
* @param root
* @return
*/
public int[] preorderTraversal(TreeNode root) {
// write code here
// 添加遍历结果的数组
List<Integer> list = new ArrayList();
preOrder(list, root);
int[] result = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
result[i] = list.get(i);
}
return result;
}
public void preOrder(List<Integer> list, TreeNode root) {
if (root == null) {
return;
}
list.add(root.val);
preOrder(list, root.left);
preOrder(list, root.right);
}
/**
* 迭代方法
* @param root
* @return
*/
pu