題目:前序遍歷二叉樹
解析:
1.遞歸遍歷
public List<Integer> preorderTraversal1(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
if (root == null) return list;
preOrder(root,list);
return list;
}
public void preOrder(TreeNode root,List<Integer> list){
if (root!= null){
list.add(root.val);
preOrder(root.left,list);
preOrder(root.right,list);
}
}
2.非遞歸 棧
①前序遍歷是先訪問根節點再訪問根節點的左孩子然後訪問根節點的右孩子;
②因此先考慮將根節點壓入棧中,再訪問根節點,然後將根節點的右孩子左孩子依次壓入棧中;
③第二步的目的是爲了遵循棧的先進後出原則,即根節點出棧之後,緊接着其左孩子出棧右孩子出棧;
④對於每個彈出棧的結點重複②③步驟,即可;
public List<Integer> preorderTraversal2(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
if (root == null) return list;
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);//首先壓入根節點
while(!stack.isEmpty()){
TreeNode node = stack.pop();
list.add(node.val);//首先訪問根節點
//將根節點的右孩子先入棧
if (node.right != null){
stack.push(node.right);
}
//將根節點的的左孩子先入棧
if (node.left != null){
stack.push(node.left);
}
}
return list;
}