递归遍历:
1.对递归基进行讨论
2.左子树进行前序遍历
3.对右子数进行前序遍历
//递归实现
public List<Integer> preorderTraversal(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<Integer> resultList = new ArrayList<>();
resultList.add(root.val);
resultList.addAll(preorderTraversal(root.left));
resultList.addAll(preorderTraversal(root.right));
return resultList;
}
迭代遍历(方法一):
1.根节点入栈
2.当栈不为空时弹出栈顶元素,对元素进行访问
3.元素的右孩子入栈,元素的左孩子入栈
4.从第2步循环
代码实现:
//迭代实现一
public List<Integer> preorderTraversal1(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
Stack<TreeNode> stack = new Stack<>();
List<Integer> resultList = new ArrayList<>();
if (root != null) {
stack.push(root);
}
while (!stack.empty()) {
root = stack.pop();
resultList.add(root.val);
if (root.right != null) {
stack.push(root.right);
}
if (root.left != null) {
stack.push(root.left);
}
}
return resultList;
}
迭代遍历(方法二):
1.沿着根遍历,接着遍历根的左孩子,根的左孩子的左孩子~
2.同时保存这些左孩子的右孩子
访问左侧分支的算法:
主体算法:
代码实现:
//迭代实现2
public List<Integer> visitAlongLeftBranch(TreeNode root,Stack<TreeNode> stack) {
List<Integer> list = new ArrayList<>();
while(root!=null) {
list.add(root.val);
stack.push(root.right);
root=root.left;
}
return list;
}
public List<Integer> preorderTraversal2(TreeNode root) {
List<Integer> resultList = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
while(true) {
resultList.addAll(visitAlongLeftBranch(root,stack));
if(stack.isEmpty()) break;
root=stack.pop();
}
return resultList;
}