二叉树的前序遍历
题目
给出一棵二叉树,返回其节点值的前序遍历。
样例
给出一棵二叉树 {1,#,2,3},
1
\
2
/
3
返回 [1,2,3].挑战
你能使用非递归实现么?
题解
1.递归法
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param root: The root of binary tree.
* @return: Preorder in ArrayList which contains node values.
*/
private ArrayList<Integer> result = new ArrayList<Integer>();
public ArrayList<Integer> preorderTraversal(TreeNode root) {
if (root == null)
{
return result;
}
result.add(root.val);
preorderTraversal(root.left);
preorderTraversal(root.right);
return result;
}
}
2.非递归法
前序遍历的规则是从根节点开始,先遍历左子节点再遍历右子节点。
遍历规则:
1.对于任一结点P,若其左子节点不为null,记录该结点后则将P入栈,并将P赋值为P的左子节点。
2.对于任一结点P,若其左子节点为null,则将P赋值为栈顶节点后弹栈,将P赋值为其右子节点,直到P和栈都为null为止。
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param root: The root of binary tree.
* @return: Preorder in ArrayList which contains node values.
*/
public ArrayList<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<Integer>();
if (root == null)
{
return result;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode p = root;
while (p!=null || !stack.empty())
{
while (p!=null)
{
result.add(p.val);
stack.push(p);
p = p.left;
}
if (!stack.empty())
{
p = stack.peek();
stack.pop();
p = p.right;
}
}
return result;
}
}
Last Update 2016.8.29