随便来一道二叉树的题目,比如说,判断二叉树是否是搜索二叉树?
所谓搜索二叉树,就是每个节点的左孩子都小于它,右孩子都大于它。
树形DP第一步
分析题目要求,选取任意一个普通节点,看看判断题目要求需要其左右孩子提供哪些条件?
比如这道题,根据搜索二叉树的定义,任意一个节点,需要大于左孩子的最大值,同时小于右孩子的最小值,这样才算是满足定义,同时,左右孩子本身还需要是搜素二叉树,因此,根据题目要求,总结出,这题需要左右孩子提供的三个数据:
1.是否是搜索二叉树
2.最小值
3.最大值
将上述左右孩子需要的返回结果,封装成一个数据结构保存,也可以不封装,在递归方法中返回也行。
树形DP第二步
写递归函数,此时,递归函数只需要考虑三件事:
第一,判断一下递归结束的位置,写出递归出口。
if(node==null){
return null;
}
第二,将上述左右孩子的返回方法当作黑盒来看,返回的结果直接使用就行了。
ReturnData leftData= BST(node.left);
ReturnData rightData= BST(node.right);
第三,利用左右孩子返回结果,实现自己的逻辑,并继续向上返回。
int min=node.value;
int max=node.value;
boolean isBst;
//判断是否合格
if((leftData==null||(leftData.isBST&&leftData.max<node.value))
&&(rightData==null||(rightData.isBST&&rightData.min>node.value))){
isBst=true;
}else {
return new ReturnData(false,min,max);
}
//求最小值
if(leftData!=null){
min=Math.min(leftData.min,node.value);
}
//求最大值
if(rightData!=null){
max=Math.max(rightData.max,node.value);
}
return new ReturnData(isBst,min,max);
完整实例代码:
public static ReturnData BST(Node node){
if(node==null){
return null;
}
ReturnData leftData= BST(node.left);
ReturnData rightData= BST(node.right);
int min=node.value;
int max=node.value;
boolean isBst;
if((leftData==null||(leftData.isBST&&leftData.max<node.value))
&&(rightData==null||(rightData.isBST&&rightData.min>node.value))){
isBst=true;
}else {
return new ReturnData(false,min,max);
}
if(leftData!=null){
min=Math.min(leftData.min,node.value);
}
if(rightData!=null){
max=Math.max(rightData.max,node.value);
}
return new ReturnData(isBst,min,max);
}