103、二叉树的锯齿形层序遍历
给你二叉树的根节点 root
,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
自上到下遍历,设根结点为第一层,那么当层数为奇数时,是从左到右遍历;当层数为偶数时,是从右到左遍历。
if(deep%2==0) Collections.reverse(list);
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
if(root==null) return new ArrayList<>();
List<List<Integer>>res=new ArrayList<>();
Queue<TreeNode>queue=new LinkedList<>();
queue.offer(root);
int deep=1;
while(!queue.isEmpty()){
int size=queue.size();
List<Integer>list=new ArrayList<>();
while(size>0){
TreeNode temp=queue.poll();
list.add(temp.val);
if(temp.left!=null) queue.offer(temp.left);
if(temp.right!=null) queue.offer(temp.right);
size--;
}
if(deep%2==0) Collections.reverse(list);
deep++;
res.add(list);
}
return res;
}
}
105、从前序与中序遍历序列构造二叉树
给定两个整数数组 preorder
和 inorder
,其中 preorder
是二叉树的先序遍历, inorder
是同一棵树的中序遍历,请构造二叉树并返回其根节点。
preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]
首先根据 preorder 第一个节点就是根结点可知:根节点是 3
然后根据根节点将 inorder 分成左子树和右子树
左子树
inorder [9]
右子树
inorder [15,20,7]
把相应的前序遍历的数组也加进来
左子树
preorder[9]
inorder [9]
右子树
preorder[20 15 7]
inorder [15,20,7]
——————————————————————————————————————————————————————————————————————————————————————
可得如下信息:
[根结点] [左子树] [右子树]
前序遍历: 3 9 20,15,7
[左子树] [根结点] [右子树]
中序遍历: 9 3 15 20 7
找到根结点,就可以以根结点为中心,构造他的左子树和右子树。
现在我们只需要构造左子树和右子树即可,成功把大问题化成了小问题
然后重复上边的步骤继续划分,直到 preorder 和 inorder 都为空,返回 null 即可
[即终止条件为if(preStart==preEnd) return null;]
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
return build(preorder,0,preorder.length,inorder,0,inorder.length);
}
public TreeNode build(int []preorder, int preStart, int preEnd, int []inorder, int infixStart,int infixEnd){
//终止条件
if(preStart==preEnd) return null;
//根据前序遍历可知第一个结点就是根结点
int rootValue=preorder[preStart];
//构造二叉树的根结点
TreeNode root=new TreeNode(rootValue);
//通过中序遍历找到根结点的所在位置
int rootIndex=-1;
for(int i=0;i<inorder.length;i++){
if(inorder[i]==rootValue){
rootIndex=i;
break;
}
}
//左子树的数量
int leftNum=rootIndex-infixStart;
//构造左子树
root.left=build(preorder, preStart+1, preStart+1+leftNum, inorder, infixStart, rootIndex);
//构造右子树
root.right=build(preorder, preStart+1+leftNum, preEnd, inorder, rootIndex+1, infixEnd);
return root;
}
}
107、二叉树的层序遍历 II
给你二叉树的根节点 root
,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
自上到下遍历后,直接Collections.reverse(list)即可
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
if(root==null)return new ArrayList<>();
List<List<Integer>>res=new ArrayList<>();
Queue<TreeNode>queue=new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int size=queue.size();
List<Integer>list=new ArrayList<>();
while(size>0){
TreeNode temp=queue.poll();
list.add(temp.val);
if(temp.left!=null) queue.offer(temp.left);
if(temp.right!=null) queue.offer(temp.right);
size--;
}
res.add(list);
}
Collections.reverse(res);
return res;
}
}