校招必备之剑指offer JAVA 全代码多实现【1~10】
校招必备之剑指offer JAVA 全代码多实现【11~20】
校招必备之剑指offer JAVA 全代码多实现【21~30】
21、题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:上来第一题就不会。还是对于后序遍历没够熟练,心中没有一张图来体现。看图应该就能理清楚了。
我们可以发现,后序遍历总是左右根,所以前一部分是左子树,中间一部分是右子树,最后是根节点。
并且由二叉搜索树的概念可知道,左子树都是比根节点小,右子树比根节点大。由此我们发现,只需分成4步。
1)找到根节点,即分区最后一个元素
2)找到第一个比根节点大的元素,并以此为分界线,该元素左边的是左子树。该元素及右边元素(除根节点)组成左子树
3)遍历右子树,只要找到一个比根节点小的,就说明违反了二叉搜索树的概念。【或者遍历左子树找比根节点小的同理】
4)然后重复前三步,分别遍历左区间和右区间判断。直到最后子叶结点
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length==0) return false;
return jugde(sequence,0,sequence.length-1);
}
public boolean jugde(int[] arr,int left,int right){
if(left>=right) return true;//子叶结点就返回true
int target=arr[right];//找到根节点
for(int i=left;i<=right;i++){
if(arr[i]>target){//找到第一个比根节点大的元素
for(int j=i;j<=right;j++){
if(arr[j]<target){//只要在右子树找到任一个比根节点小的就说明不是
return false;
}
}
jugde(arr,i,right-1);//重复前三步
jugde(arr,left,i-1);
break;
}
}
return true;
}
}
22、题目描述
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
思路:DFS,迭代的自己写了一下写不出来。就用递归的了。感兴趣的自己实现一下
import java.util.*;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> arr=new ArrayList<Integer>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
find(root,target);
Collections.sort(res,new Comparator<ArrayList<Integer>>(){
@Override
public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
return o1.size()<o2.size()?1:-1;
}
});
return res;
}
public void find(TreeNode node,int target){
if(node==null||node.val>target) return;
arr.add(node.val);
if(node.left==null&&node.right==null&&node.val==target){
res.add(new ArrayList<Integer>(arr));
}
find(node.left,target-node.val);
find(node.right,target-node.val);
arr.remove(arr.size()-1);
}
}