class  Solution  { int  pre; int  ans; public  int  getMinimumDifference ( TreeNode  root)  { ans =  Integer . MAX_VALUE ; pre =  - 1 ; dfs ( root) ; return  ans; } public  void  dfs ( TreeNode  root)  { if  ( root ==  null )  { return ; } dfs ( root. left) ; if  ( pre ==  - 1 )  { pre =  root. val; }  else  { ans =  Math . min ( ans,  root. val -  pre) ; pre =  root. val; } dfs ( root. right) ; } 
} 
 
中序遍历+hashMap,考虑优化使用hashMap的时间复杂度; 考虑到二叉搜索树中序遍历的有序性,实现一个update函数,根据记录频率实现众数的记录与更新 如果所遍历节点值x=base,那么count+1; 如果不等于base,那么把base加入answer数组,然后令base=x,count=1; 如果count=maxcount,那么说明该该数字出现的次数和已经出现的众数出现的次数一样,就把该数base存入数组answer中; 如果count>maxcount,那么需要将max更新为maxcount。 并情况answer数组,将base加入数组中; class  Solution  { List < Integer > =  new  ArrayList < Integer > ( ) ; int  base,  count,  maxCount; public  int [ ]  findMode ( TreeNode  root)  { dfs ( root) ; int [ ]  mode =  new  int [ answer. size ( ) ] ; for  ( int  i =  0 ;  i <  answer. size ( ) ;  ++ i)  { mode[ i]  =  answer. get ( i) ; } return  mode; } public  void  dfs ( TreeNode  T )  { if  ( T  ==  null )  { return ; } dfs ( T . left) ; update ( T . val) ; dfs ( T . right) ; } public  void  update ( int  x)  { if  ( x ==  base)  { ++ count; }  else  { count =  1 ; base =  x; } if  ( count ==  maxCount)  { answer. add ( base) ; } if  ( count >  maxCount)  { maxCount =  count; answer. clear ( ) ; answer. add ( base) ; } } 
} 
 
后序遍历可以最后处理根节点,相当于记录根节点; 递归终止逻辑是:根节点为空,那么说明不存在p和q;或者p和q其中一个和根节点一致,那么直接返回该根节点即可; 然后进行递归遍历,去获得 如果 public  class  Solution  { public  TreeNode  lowestCommonAncestor ( TreeNode  root,  TreeNode  p,  TreeNode  q)  { if  ( root ==  null  ||  root ==  p ||  root ==  q)  { return  root; } 
TreeNode  left =  lowestCommonAncestor ( root. left,  p,  q) ; TreeNode  right =  lowestCommonAncestor ( root. right,  p,  q) ; if  ( left !=  null  &&  right !=  null )  { return  root; } return  left !=  null  ?  left :  right; } 
} 
 
递归出口是null很重要; 当前节点的左右节点接住了上一层入栈函数的返回函数,返回的是null;