//前序遍历
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list=new ArrayList();
//调用递归函数
preorder(root , list);
return list;
}
public static void preorder(TreeNode root,List<Integer> list){
//1)截止条件
if(root==null) return;
//2)操作
list.add(root.val);
//3)递归函数
preorder(root.left,list);
preorder(root.right,list);
}
}
//前序遍历
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
//方法二:迭代解法
//1)定义集合和栈
List<Integer> list=new ArrayList<>();
ArrayDeque<TreeNode> deque=new ArrayDeque<>();
//2)特殊情况
if(root==null) return list;
deque.push(root);
//3)进行循环
while(deque.size()>0){
//先删除父节点,然后判断压入子节点(从右到左)
TreeNode fa=deque.pop();
list.add(fa.val);
if(fa.right!=null) deque.push(fa.right) ;
if(fa.left!=null) deque.push(fa.left) ;
}
//4)返回结果
return list;
}
}
//后续遍历
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
//迭代方法
//需要的结果是左右中,可以先做出来中右左-反转得到左右中
//为了得到中右左,故压栈的顺序为中左右
//1)集合和栈的定义
List<Integer> list=new ArrayList<>();
ArrayDeque<TreeNode> deque=new ArrayDeque<>();
//2)特殊情况
if(root==null) return list;
deque.push(root);
//3)开始循环遍历
while(deque.size()>0){
TreeNode temp=deque.pop();
list.add(temp.val); //中间
if(temp.left!=null) deque.push(temp.left);
if(temp.right!=null) deque.push(temp.right);
}
//4)进行反转
Collections.reverse(list);
return list;
}
}
public List<List<Integer>> levelOrder(TreeNode root) {
//1)新建集合和队列
List<List<Integer>> data=new ArrayList<>();
ArrayDeque<TreeNode> deque=new ArrayDeque<>();
//特殊情况
if(root==null) return data;
deque.offer(root);
//3)两层while循环
int size;
while(deque.size()!=0){
//(1)新建一维集合装数据,计算size的大小,方便二层循环
List<Integer> list=new ArrayList<>();
size=deque.size();
while(size-->0){
//(2)先把数据装进行,然后看子节点是否需要装入队列中
if(deque.peek().left!=null) deque.offer(deque.peek().left);
if(deque.peek().right!=null) deque.offer(deque.peek().right);
list.add(deque.poll().val); //查找的同时进行删除
}
data.add(list);
}
return data;
}
因篇幅问题不能全部显示,请点此查看更多更全内容