难度:简单
频次:74
题目:给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
解题思路:
- 递归法
- 迭代法
递归法
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res=new ArrayList<Integer>();
dfs(res,root);
return res;
}
public void dfs(List<Integer> res,TreeNode root){
//终止条件:root为null
if(root==null) return;
//先遍历中间节点
res.add(root.val);
//再左后右
dfs(res,root.left);
dfs(res,root.right);
}
}
迭代法(用栈模拟递归)
注意:
- 遍历的条件时栈不为空(.size()>0)或者遍历的节点不为空===>即终止的条件就是root==null,并且栈里没有节点
- 遍历节点,如果节点不为空,,并记录该节点,再把节点push到栈里,然后再遍历该节点的左节点
- 遍历节点,如果节点为空,把栈里的节点pop出来,且遍历该节点的右节点
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res=new ArrayList<Integer>();
Stack<TreeNode> stack=new Stack<TreeNode>();
//当遍历的节点不为空或者栈不为空时,
//进行遍历===》即当前遍历的节点为null,并且栈里没有节点,停止遍历
while(root!=null||stack.size()>0){
//当遍历的节点不为null时
while(root!=null){
//先把根节点记录到res里
res.add(root.val);
//将该节点push到栈里
stack.push(root);
//遍历该节点的右节点
root=root.left;
}
//当遍历的节点为null并且栈里有节点时,先弹出栈里的一个节点
root=stack.pop();
//再遍历该节点的右节点
root=root.right;
}
return res;
}
}