这篇文章的目的只是整理几个常用的二叉树递归/非递归遍历的模板函数,方便用到的时候凭借记忆写出来即可。内容没多少技术含量,写给自己看的,权当参考。
前序遍历
递归:很简单,按照根左右的逻辑访问就是。
public List<Integer> preorderTraversal(TreeNode root){
List<Integer> res = new ArrayList<Integer>();
inorder(root, res);
return res;
}
public void preorder(TreeNode root, List<Integer> res){
if(root == null) return;
res.add(root.val);
preorder(root.left, res);
preorder(root.right, res);
}
在所有树状结构的数据结构当中,递归真的是一种最最省事的写法了。如果题目没有要求,建议直接递归就vans了。
非递归(这才是本篇文章的重点):用一个栈,前序遍历的非递归是三种非递归当中最好理解的一种了,先把根节点入栈,再遵循当前节点弹栈->当前节点左节点入栈->当前节点右节点入栈即可。
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
if(root != null){
stack.push(root);
}
TreeNode temp;
while(!stack.isEmpty()){
temp = stack.pop();
res.add(temp.val);
if(temp.right != null){
stack.push(temp.right);
}
if(temp.left != null){