目录
两天没刷一下落下四道
一道二叉树搜索题
关键在于左子树只包含小于它的,右子树只包含大于他的,我们可以利用它的性质,定义一个max和一个min,然后根据root的val值进行局部划分,也就是递归,当左边右边都满足时,说明为true
class Solution {
public boolean isValidBST(TreeNode root) {
return isBST(root,Long.MIN_VALUE,Long.MAX_VALUE);
}
public boolean isBST(TreeNode node,long lower,long upper){
if(node==null){
return true;
}
//如果节点不在这个范围内就false,一开始会给个max 与min,默认所有值都可以为节点
if(node.val<=lower||node.val>=upper){
return false;
}
//递归然后对值进行限制,两边,一边是左子树,一边为右子树
return isBST(node.left,lower,node.val)&&isBST(node.right,node.val,upper);
}
}
寻找共同祖先
这题直接暴力,寻找p,q两个节点的共同祖先,我们可以从root下手 ,while循环进行遍历,只要不等于pq两个目标节点就一直循环,如果大于root,root节点就右移,否则左移,中途节点全部加入list中,直至找到pq节点为止,然后对两个list进行遍历,寻找相同节点
package com;
import java.util.ArrayList;
import java.util.List;
public class Test {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
//1.new两条路径,然后得到共同节点就完了
List<TreeNode> path_p = getPath(root, p);
List<TreeNode> path_q = getPath(root, q);
//定义一个共同祖先
TreeNode ancestor=null;
for (int i = 0; i < path_q.size()&&i<path_p.size(); i++) {
if(path_p.get(i)==path_q.get(i)){
ancestor=path_p.get(i);
}else{
break;
}
}
return ancestor;
}
//2.辅助方法,传入一个节点和一个目标节点得到路径节点集合
public List<TreeNode> getPath(TreeNode root,TreeNode target){
ArrayList<TreeNode> path = new ArrayList<>();
TreeNode node = root;
//利用循环添加路过节点
while(node!=target){
//只要不等于目标节点,就将其添入
path.add(node);
if(node.val<target.val){
node=node.right;
}else{
node=node.left;
}
}
//找到目标节点,将其添入
path.add(target);
return path;
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
二叉树中序前序后序遍历