题目描述
给定一个二叉树,返回它的 前序 遍历
样例
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,2,3]
思路分析
方法一:递归,由先序“根左右”的顺序,依次遍历,进行递归即可
方法二:非递归实现,由根节点向左遍历,直到叶子节点,随后pop操作相当于返回上一节点,再遍历右子树部分即可
方法三:双指针法 思路同中序遍历
代码及结果
方法一
public List<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> list = new ArrayList<Integer>();
if (root == null) {
return list;
}
return preorderTraversal(root,list);
}
public List<Integer> preorderTraversal(TreeNode root,List<Integer> list) {
if (root != null) {
list.add(root.val);
if (root.left != null) {
preorderTraversal(root.left, list);
}
if (root.right != null) {
preorderTraversal(root.right, list);
}
}
return list;
}
方法二:
public List<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> list = new ArrayList<Integer>();
if (root == null) {
return list;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode temp = root;
while (!stack.isEmpty() || temp!=null) {
while (temp != null) {
list.add(temp.val);
stack.push(temp);
temp = temp.left;
}
temp = stack.pop();
temp = temp.right;
}
return list;
}
方法三:
//非递归 不用栈
public List<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> list = new ArrayList<Integer>();
TreeNode cur = root;
TreeNode pre = null;
while (cur != null) {
if (cur.left == null) {
list.add(cur.val);
cur = cur.right;
}
else {
pre = cur.left;
while (pre.right!=null && pre.right!=cur) {
pre = pre.right;
}
if (pre.right == null) {
pre.right = cur;
list.add(cur.val);
cur = cur.left;
}
else {
pre.right = null;
cur = cur.right;
}
}
}
return list;
}