/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private int ans;
public int diameterOfBinaryTree(TreeNode root) {
dfs(root);
return ans;
}
private int dfs(TreeNode node){
if(node == null)return -1;//如果空的话返回-1 后面+1可以补成0
int lLen = dfs(node.left) + 1;//左子树最大链长+1
int rLen = dfs(node.right) + 1;//右字数最大链长+1
ans = Math.max(ans,lLen + rLen);//两条链拼成路径
return Math.max(lLen,rLen);//当前字数的最大链长
}
}
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
List<List<Integer>> res = new ArrayList<>();
if(root != null)queue.add(root);
while(!queue.isEmpty()){
List<Integer> temp = new ArrayList<>();
for(int i = queue.size();i>0;i--){
TreeNode node = queue.poll();//返回并弹出
temp.add(node.val);
if(node.left != null)queue.add(node.left);
if(node.right != null)queue.add(node.right);
}
res.add(temp);
}
return res;
}
}
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isValidBST(TreeNode root) {
return isValidBST(root,Long.MIN_VALUE,Long.MAX_VALUE);
}//区间
private boolean isValidBST(TreeNode node,long left,long right){
if(node == null)return true;
long x = node.val;
return left<x && x<right &&
isValidBST(node.left,left,x)&&
isValidBST(node.right,x,right);
}
}
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private long pre = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if(root == null)return true;//递归终止的条件
if(!isValidBST(root.left) || root.val <= pre)return false;//遍历完左子树看端点值
pre = root.val;//更新端点值
return isValidBST(root.right);//去右节点找左子树继续看
}
}
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isValidBST(TreeNode root) {
return dfs(root)[1] != Long.MAX_VALUE;
}
private long[] dfs(TreeNode node) {//大于左边的最大值 小于右边的最小值
if (node == null) {
return new long[]{Long.MAX_VALUE, Long.MIN_VALUE};
}//最大值 最小值
long[] left = dfs(node.left);
long[] right = dfs(node.right);
long x = node.val;
// 也可以在递归完左子树之后立刻判断,如果发现不是二叉搜索树,就不用递归右子树了
if (x <= left[1] || x >= right[0]) {
return new long[]{Long.MIN_VALUE, Long.MAX_VALUE};
}//不成立
return new long[]{Math.min(left[0], x), Math.max(right[1], x)};
}
}
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {//二叉搜索树 左<中<右 故中序遍历是递增的
int res , k;
void dfs(TreeNode root){
if(root == null)return ;
dfs(root.left);
if(k==0)return ;
if(--k == 0)res = root.val;
dfs(root.right);
}
public int kthSmallest(TreeNode root, int k) {
this.k = k;
dfs(root);
return res;
}
}