package  jz. bm ; import  jz.  TreeNode ; import  java. util.  * ; public  class  bm3 { public  int [ ]  preorderTraversal ( TreeNode  root)  { ArrayList < Integer > =  new  ArrayList < > ( ) ; preOrder ( root,  list) ; int [ ]  res =  new  int [ list. size ( ) ] ; for  ( int  i =  0 ;  i <  list. size ( ) ;  i++ )  { res[ i]  =  list. get ( i) ; } return  res; } private  void  preOrder ( TreeNode  root,  ArrayList < Integer > )  { if  ( root !=  null )  { list. add ( root. val) ; preOrder ( root. left,  list) ; preOrder ( root. right,  list) ; } } public  int [ ]  inorderTraversal ( TreeNode  root)  { ArrayList < Integer > =  new  ArrayList < > ( ) ; inOrder ( root,  list) ; int [ ]  res =  new  int [ list. size ( ) ] ; for  ( int  i =  0 ;  i <  list. size ( ) ;  i++ )  { res[ i]  =  list. get ( i) ; } return  res; } private  void  inOrder ( TreeNode  root,  ArrayList < Integer > )  { if  ( root !=  null )  { inOrder ( root. left,  list) ; list. add ( root. val) ; inOrder ( root. right,  list) ; } } public  int [ ]  postorderTraversal ( TreeNode  root)  { ArrayList < Integer > =  new  ArrayList < > ( ) ; postOrder ( root,  list) ; int [ ]  res =  new  int [ list. size ( ) ] ; for  ( int  i =  0 ;  i <  list. size ( ) ;  i++ )  { res[ i]  =  list. get ( i) ; } return  res; } private  void  postOrder ( TreeNode  root,  ArrayList < Integer > )  { if  ( root !=  null )  { postOrder ( root. left,  list) ; postOrder ( root. right,  list) ; list. add ( root. val) ; } } public  ArrayList < ArrayList < Integer > > ( TreeNode  root)  { ArrayList < ArrayList < Integer > > =  new  ArrayList < > ( ) ; if  ( root ==  null )  { return  res; } Queue < TreeNode > =  new  LinkedList < > ( ) ; queue. add ( root) ; while  ( ! queue. isEmpty ( ) )  { int  n =  queue. size ( ) ; ArrayList < Integer > =  new  ArrayList < > ( ) ; for  ( int  i =  0 ;  i <  n;  i++ )  { TreeNode  cur =  queue. poll ( ) ; list. add ( cur. val) ; if  ( cur. left !=  null )  { queue. add ( cur. left) ; } if  ( cur. right !=  null )  { queue. add ( cur. right) ; } } res. add ( list) ; } return  res; } public  ArrayList < ArrayList < Integer >  > Print ( TreeNode  pRoot)  { ArrayList < ArrayList < Integer > > =  new  ArrayList < > ( ) ; if  ( pRoot ==  null )  { return  res; } Queue < TreeNode > =  new  LinkedList < > ( ) ; queue. add ( pRoot) ; boolean  flag =  false ; while  ( ! queue. isEmpty ( ) )  { int  n =  queue. size ( ) ; ArrayList < Integer > =  new  ArrayList < > ( ) ; for  ( int  i =  0 ;  i <  n;  i++ )  { TreeNode  cur =  queue. poll ( ) ; list. add ( cur. val) ; if  ( cur. left !=  null )  { queue. add ( cur. left) ; } if  ( cur. right !=  null )  { queue. add ( cur. right) ; } } if  ( flag)  { Collections . reverse ( list) ; } flag =  ! flag; res. add ( list) ; } return  res; } int  max =  0 ; public  int  maxDepth ( TreeNode  root)  { dfs28 ( root,  0 ) ; return  max; } private  void  dfs28 ( TreeNode  root,  int  depth)  { if  ( root !=  null )  { depth +=  1 ; max =  Math . max ( max,  depth) ; dfs28 ( root. left,  depth) ; dfs28 ( root. right,  depth) ; } } boolean  hasPath =  false ; public  boolean  hasPathSum ( TreeNode  root,  int  sum)  { dfs29 ( root,  sum) ; return  hasPath; } private  void  dfs29 ( TreeNode  root,  int  cur)  { if  ( root !=  null )  { cur -=  root. val; if  ( root. left ==  null  &&  root. right ==  null  &&  cur ==  0 )  { hasPath =  true ; return ; } dfs29 ( root. left,  cur) ; dfs29 ( root. right,  cur) ; } } TreeNode  head; TreeNode  pre; public  TreeNode  Convert ( TreeNode  pRootOfTree)  { if  ( pRootOfTree !=  null )  { Convert ( pRootOfTree. left) ; if  ( pre ==  null )  { head =  pRootOfTree; }  else  { pre. right =  pRootOfTree; pRootOfTree. left =  pre; } pre =  pRootOfTree; Convert ( pRootOfTree. right) ; } return  head; } public  boolean  isSymmetrical ( TreeNode  pRoot)  { if  ( pRoot !=  null )  { return  mirror ( pRoot. left,  pRoot. right) ; }  else  { return  true ; } } private  boolean  mirror ( TreeNode  left,  TreeNode  right)  { if  ( left ==  null  &&  right ==  null )  { return  true ; } if  ( right ==  null  ||  left ==  null  ||  left. val !=  right. val)  { return  false ; } return  mirror ( left. left,  right. right)  &&  mirror ( left. right,  right. left) ; } public  TreeNode  mergeTrees ( TreeNode  t1,  TreeNode  t2)  { if  ( t1 ==  null )  { return  t2; } if  ( t2 ==  null )  { return  t1; } t1. val =  t1. val +  t2. val; t1. left =  mergeTrees ( t1. left,  t2. left) ; t1. right =  mergeTrees ( t1. right,  t2. right) ; return  t1; } boolean  res34 =  true ; TreeNode  pre34 =  null ; public  boolean  isValidBST ( TreeNode  root)  { inOrder ( root) ; return  res34; } private  void  inOrder ( TreeNode  root)  { if  ( root !=  null )  { inOrder ( root. left) ; if  ( pre34 ==  null )  { pre34 =  root; }  else  { if  ( root. val <=  pre34. val)  { res34 =  false ; } } pre34 =  root; inOrder ( root. right) ; } } public  boolean  isCompleteTree ( TreeNode  root)  { if  ( root ==  null )  { return  true ; } Queue < TreeNode > =  new  LinkedList < > ( ) ; queue. add ( root) ; boolean  hasNull =  false ; while  ( ! queue. isEmpty ( ) )  { TreeNode  cur =  queue. poll ( ) ; if  ( cur ==  null )  { hasNull =  true ;  }  else  { if  ( hasNull)  { return  false ; } queue. add ( cur. left) ; queue. add ( cur. right) ; } } return  true ; } public  boolean  IsBalanced_Solution  ( TreeNode  pRoot)  { if  ( pRoot ==  null )  { return  true ; } return  IsBalanced_Solution ( pRoot. left)  &&  IsBalanced_Solution ( pRoot. right)  &&  Math . abs ( dfs36 ( pRoot. left)  -  dfs36 ( pRoot. right) )  <=  1 ; } private  int  dfs36 ( TreeNode  pRoot)  { if  ( pRoot !=  null )  { return  Math . max ( dfs36 ( pRoot. left) ,  dfs36 ( pRoot. right) )  +  1 ; } return  0 ; } public  int  lowestCommonAncestor ( TreeNode  root,  int  p,  int  q)  { if  ( root ==  null )  { return  - 1 ; } if  ( ( p <=  root. val &&  root. val <=  q)  ||  ( q <=  root. val &&  root. val <=  p) )  { return  root. val; }  else  if  ( p <=  root. val &&  q <=  root. val)  { return  lowestCommonAncestor ( root. left,  p,  q) ; }  else  { return  lowestCommonAncestor ( root. right,  p,  q) ; } } public  int  lowestCommonAncestor1 ( TreeNode  root,  int  o1,  int  o2)  { if  ( root ==  null )  { return  - 1 ; } if  ( o1 ==  root. val ||  o2 ==  root. val)  { return  root. val; } int  left =  lowestCommonAncestor1 ( root. left,  o1,  o2) ; int  right =  lowestCommonAncestor1 ( root. right,  o1,  o2) ; if  ( left ==  - 1 )  { return  right; } if  ( right ==  - 1 )  { return  left; } return  root. val; } public  TreeNode  reConstructBinaryTree ( int [ ]  preOrder,  int [ ]  vinOrder)  { if  ( preOrder. length ==  0  ||  vinOrder. length ==  0 )  { return  null ; } TreeNode  head =  new  TreeNode ( preOrder[ 0 ] ) ; int  index =  getIndex ( preOrder[ 0 ] , vinOrder) ; head. left =  reConstructBinaryTree ( Arrays . copyOfRange ( preOrder,  1 ,  index +  1 ) ,  Arrays . copyOfRange ( vinOrder,  0 ,  index) ) ; head. right =  reConstructBinaryTree ( Arrays . copyOfRange ( preOrder,  index +  1 ,  preOrder. length) ,  Arrays . copyOfRange ( vinOrder,  index +  1 ,  vinOrder. length) ) ; return  head; } private  int  getIndex ( int  head,  int [ ]  vinOrder)  { for  ( int  i =  0 ;  i <  vinOrder. length;  i++ )  { if  ( head ==  vinOrder[ i] )  { return  i; } } return  - 1 ; } public  int [ ]  solve ( int [ ]  preOrder,  int [ ]  inOrder)  { TreeNode  head =  reConstructBinaryTree ( preOrder,  inOrder) ; if  ( head ==  null )  { return  new  int [ 0 ] ; } ArrayList < Integer > =  new  ArrayList < > ( ) ; Queue < TreeNode > =  new  LinkedList < > ( ) ; queue. add ( head) ; while  ( ! queue. isEmpty ( ) )  { int  n =  queue. size ( ) ; for  ( int  i =  0 ;  i <  n;  i++ )  { TreeNode  cur =  queue. poll ( ) ; if  ( i ==  n -  1 )  { list. add ( cur. val) ; } if  ( cur. left !=  null )  { queue. add ( cur. left) ; } if  ( cur. right !=  null )  { queue. add ( cur. right) ; } } } int [ ]  res =  new  int [ list. size ( ) ] ; for  ( int  i =  0 ;  i <  list. size ( ) ;  i++ )  { res[ i]  =  list. get ( i) ; } return  res; } 
}