递归实现:
当节点不为空时,每次遍历现将节点值添加进list,之后,左子树补空,遍历左子树;右指数不空,遍历右子树;最终返回list。需要注意的是根节点为空的情况,在遍历之前,根节点为空,直接返回(全局)list。
//前序遍历递归排序
public class solution{
ArrayList<Integer> list = new ArrayList<>();
public ArrayList<Integer> preOrderTraveral(TreeNode root){
if(root==null)
return list;
list.add(root.val);
if(root.left!=null)
preOrderTraveral(root.left);
if(root.right!=null)
preOrderTraveral(root.right);
return list;
}
}
非递归实现:
主要采用数据结构栈来辅助实现。每pop一个节点(当前根节点),前提是栈不为空,先将节点右孩子入栈,再将左孩子入栈(前提是孩子存在),依次pop及push。
//前序遍历非递归排序(用栈实现)
public class solution{
ArrayList<Integer> list = new ArrayList<>();
public ArrayList<Integer> preOrderTravel(TreeNode root){
if(root==null)
return list;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode temp = stack.pop();
if(temp.right!=null)
stack.push(temp.right);
if(temp.left!=null)
stack.push(temp.left);
}
return list;
}
}