题目:前序遍历二叉树
解析:
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;
}