开篇: 本篇文章主要记录二叉树的前、中、后、层次遍历以及相关变形题解。
第一题:二叉树的前序遍历
方法一:递归
public List<Integer> preOrder(TreeNode root){
List<Integer> list=new ArrayList<>();
preOrder(root,list);
return list;
}
private void preOrder(TreeNode root, List<Integer> list) {
if(root==null)
return ;
if(root!=null){
list.add(root.val);
if(root.left!=null)
preOrder(root.left,list);
if(root.right!=null)
preOrder(root.right,list);
}
}
方法二:迭代
public List<Integer> preOrder2(TreeNode root){
LinkedList<Integer> list=new LinkedList<>();
if(root==null)
return list;
LinkedList<TreeNode> arr=new LinkedList<>();
arr.add(root);
while(!arr.isEmpty()){
TreeNode cur=arr.pollLast();
list.add(cur.val);
if(cur.right!=null)
arr.add(cur.right);
if(cur.left!=null)
arr.add(cur.left);
}
return list;
}
第二题:二叉树的中序遍历
方法一:递归
public List<Integer> inOrder(TreeNode root){
List<Integer> list=new ArrayList<>();
inOrder(root,list);
return list;
}
private void inOrder(TreeNode root, List<Integer> list) {
if(root==null)
return ;
if(root!=null){
if(root.left!=null)
inOrder(root.left,list);
list.add(root.val);
if(root.right!=null)
inOrder(root.right,list);
}
}
方法二:迭代
public List<Integer> inOrder2(TreeNode root){
List<Integer> list=new ArrayList<>();
if(root==null)
return list;
Stack<TreeNode> arr=new Stack<>();
TreeNode node=root;
while (!arr.isEmpty()||node!=null){
while(node!=null){
arr.add(node);
node=node.left;
}
node=arr.pop();
if(node==null)
continue;
list.add(node.val);
node=node.right;
}
return list;
}
第三题:二叉树的后序遍历
方法一:递归
public List<Integer> postOrder(TreeNode node){
List<Integer> list=new ArrayList<>();
postOrder(node,list);
return list;
}
private void postOrder(TreeNode node, List<Integer> list) {
if(node==null)
return ;
if(node!=null){
if(node.left!=null)
postOrder(node.left,list);
if(node.right!=null)
postOrder(node.right,list);
list.add(node.val);
}
}
方法二:迭代
public List<Integer> postOrder2(TreeNode root){
LinkedList<Integer> list=new LinkedList<>();
LinkedList<TreeNode> cur=new LinkedList<>();
if(root==null)
return list;
cur.add(root);
while (!cur.isEmpty()){
TreeNode node=cur.pollLast();
list.addFirst(node.val);
if(node.left!=null)
cur.add(node.left);
if(node.right!=null)
cur.add(node.right);
}
return list;
}
第四题:二叉树的层次遍历
解法:BFS
public List<List<Integer>> levelOrder(TreeNode root){
List<List<Integer>> list=new ArrayList<>();
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int size=queue.size();
List<Integer> level=new LinkedList<>();
for(int i=0;i<size;i++){
TreeNode node=queue.peek();
queue.poll();
if(node==null)
continue;
level.add(node.val);
queue.add(node.left);
queue.add(node.right);
}
if(level.size()!=0)
list.add(level);
}
return list;
}
第五题:二叉树的锯齿形层次遍历
public List<List<Integer>> levelorder2(TreeNode root){
List<List<Integer>> list=new ArrayList<>();
if(root==null)
return list;
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);
int count=0;
while(!queue.isEmpty()){
int size=queue.size();
List<Integer> level=new ArrayList<>();
for(int i=0;i<size;i++){
TreeNode node=queue.peek();
queue.poll();
if(node==null)
continue;
if(count%2==0){
level.add(node.val);
}else{
level.add(0,node.val);
}
queue.offer(node.left);
queue.offer(node.right);
}
count++;
if(level.size()!=0)
list.add(level);
}
return list;
}
第六题:从前序与中序遍历序列构造二叉树
public TreeNode buildTree(int[] pre,int[] in){
if(pre==null ||in==null)
return null;
return buildTree(pre,0,pre.length-1,in,0,in.length-1);
}
private TreeNode buildTree(int[] pre, int prestart, int preend, int[] in, int instart, int inend) {
if(prestart>preend ||instart>inend)
return null;
TreeNode node=new TreeNode(pre[prestart]);
for(int i=instart;i<=inend;i++){
if(pre[prestart]==in[i]){
node.left=buildTree(pre,prestart+1,prestart+i-instart,in,instart,i-1);
node.right=buildTree(pre,prestart+i-instart+1,preend,in,i+1,inend);
}
}
return node;
}