标签:类型 order result add 步骤 方法 bin 返回值 分治
public ArrayList<Integer> preorderTraversal(TreeNode root) {
// write your code here
Stack<TreeNode> stack = new Stack<TreeNode>();
//找一个容器进行存储
ArrayList<Integer> preorder = new ArrayList<Integer>();
//特殊情况的考虑
if (root == null) {
return preorder;
}
//利用栈的特性, 每次出一个,进俩子树,先进右后出右
//栈 非空时表示没有遍历完.
//一个节点进站出站一次,没有多余的循环,因此时间复杂度为O(n)
stack.push(root);
while (!stack.empty()) {
TreeNode node = stack.pop();
preorder.add(node.val);
if (node.right != null) {
stack.push(node.right);
}
if (node.left != null) {
stack.push(node.left);
}
}
return preorder;
}
public ArrayList<Integer> preorderTraversal(TreeNode root) {
//返回值类型
ArrayList<Integer> result = new ArrayList<Integer>();
//调用递归函数
traverse(root, result);
//求得返回值
return result;
}
//递归函数没有返回值因此将结果作为参数
private void traverse(TreeNode root, ArrayList<Integer> result) {
//递归出口
if (root == null) {
return;
}
//根据要求操作节点进入返回值的结果 或 容器
result.add(root.val);
//递归左右子树
traverse(root.left, result);
traverse(root.right, result);
}
public ArrayList<Integer> preorderTraversal(TreeNode root) {
//定义结果返回类型
ArrayList<Integer> result = new ArrayList<Integer>();
//递归出口
if(root == null) {
//返回结果类型
return result;
}
//Divide
//将左右子树分别加入结果
ArrayList<Integer> left = preorderTraversal(root.left);
ArrayList<Integer> right = preorderTraversal(root.right);
//conquer: 分情况讨论
//根据要求操作节点进入结果
result.add(root.val);
//操作左子树和右子树
result.addAll(left);
result.addAll(right);
//返回结果
return result;
}
分治法的步骤, 递归出口, 先分-> 操作, 再合->操作, 返回
Binary tree preorder traversal
标签:类型 order result add 步骤 方法 bin 返回值 分治
原文地址:http://www.cnblogs.com/apanda009/p/7237024.html