遞歸實現:
當節點不爲空時,每次遍歷現將節點值添加進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;
}
}