判断
class Solution {
public boolean isSymmetric ( TreeNode root) {
if ( root== null ) return true ;
return compare ( root. left, root. right) ;
}
public static boolean compare ( TreeNode left, TreeNode right) {
if ( left== null && right== null ) return true ;
if ( left== null && right!= null || left!= null && right== null || left. val!= right. val) return false ;
boolean res1 = compare ( left. left, right. right) ;
boolean res2 = compare ( left. right, right. left) ;
return res1&& res2;
}
}
class Solution {
public boolean isSymmetric ( TreeNode root) {
Deque < TreeNode > deque = new LinkedList < > ( ) ;
deque. offerFirst ( root. left) ;
deque. offerLast ( root. right) ;
while ( ! deque. isEmpty ( ) ) {
TreeNode leftNode = deque. pollFirst ( ) ;
TreeNode rightNode = deque. pollLast ( ) ;
if ( leftNode== null && rightNode== null ) {
continue ;
}
if ( leftNode== null || rightNode== null || leftNode. val!= rightNode. val) {
return false ;
}
deque. offerFirst ( leftNode. left) ;
deque. offerFirst ( leftNode. right) ;
deque. offerLast ( rightNode. right) ;
deque. offerLast ( rightNode. left) ;
}
return true ;
}
}
class Solution {
public boolean isSymmetric ( TreeNode root) {
Deque < TreeNode > deque = new LinkedList < > ( ) ;
deque. offer ( root. left) ;
deque. offer ( root. right) ;
while ( ! deque. isEmpty ( ) ) {
TreeNode leftNode = deque. poll ( ) ;
TreeNode rightNode = deque. poll ( ) ;
if ( leftNode== null && rightNode== null ) {
continue ;
}
if ( leftNode== null || rightNode== null || leftNode. val!= rightNode. val) {
return false ;
}
deque. offer ( leftNode. left) ;
deque. offer ( rightNode. right) ;
deque. offer ( leftNode. right) ;
deque. offer ( rightNode. left) ;
}
return true ;
}
}
class Solution {
public boolean isSameTree ( TreeNode p, TreeNode q) {
if ( p== null && q== null ) return true ;
if ( p== null || q== null || p. val!= q. val) return false ;
boolean bool1 = isSameTree ( p. left, q. left) ;
boolean bool2 = isSameTree ( p. right, q. right) ;
return bool1&& bool2;
}
}
class Solution {
public boolean isSubtree ( TreeNode root, TreeNode subRoot) {
if ( root== null ) return false ;
return isSameTree ( root, subRoot) || isSubtree ( root. left, subRoot) || isSubtree ( root. right, subRoot) ;
}
public static boolean isSameTree ( TreeNode p, TreeNode q) {
if ( p== null && q== null ) return true ;
if ( p== null || q== null || p. val!= q. val) return false ;
boolean bool1 = isSameTree ( p. left, q. left) ;
boolean bool2 = isSameTree ( p. right, q. right) ;
return bool1&& bool2;
}
}
深度
class Solution {
public int maxDepth ( TreeNode root) {
if ( root== null ) return 0 ;
int len1 = maxDepth ( root. left) ;
int len2 = maxDepth ( root. right) ;
return Math . max ( len1, len2) + 1 ;
}
}
class Solution {
public int maxDepth ( TreeNode root) {
int res = 0 ;
if ( root== null ) return res;
Queue < TreeNode > queue = new LinkedList ( ) ;
queue. offer ( root) ;
while ( ! queue. isEmpty ( ) ) {
int size = queue. size ( ) ;
for ( int i= 0 ; i< size; i++ ) {
TreeNode node = queue. poll ( ) ;
if ( node. left!= null ) queue. offer ( node. left) ;
if ( node. right!= null ) queue. offer ( node. right) ;
}
res++ ;
}
return res;
}
}
class Solution {
public int maxDepth ( Node root) {
int res = 0 ;
if ( root== null ) return res;
for ( Node node: root. children) {
int len = maxDepth ( node) ;
res = Math . max ( len, res) ;
}
return res+ 1 ;
}
}
class Solution {
public int maxDepth ( Node root) {
int res = 0 ;
if ( root== null ) return res;
Queue < Node > queue = new LinkedList ( ) ;
queue. offer ( root) ;
while ( ! queue. isEmpty ( ) ) {
int size = queue. size ( ) ;
for ( int i= 0 ; i< size; i++ ) {
Node node = queue. poll ( ) ;
for ( Node node1: node. children) {
queue. offer ( node1) ;
}
}
res++ ;
}
return res;
}
}
class Solution {
public int minDepth ( TreeNode root) {
if ( root== null ) return 0 ;
int len1 = minDepth ( root. left) ;
int len2 = minDepth ( root. right) ;
if ( root. left== null ) return len2+ 1 ;
if ( root. right== null ) return len1+ 1 ;
return Math . min ( len1, len2) + 1 ;
}
}
class Solution {
public int minDepth ( TreeNode root) {
int res = 0 ;
if ( root== null ) return res;
Queue < TreeNode > queue = new LinkedList ( ) ;
queue. offer ( root) ;
while ( ! queue. isEmpty ( ) ) {
int size = queue. size ( ) ;
res++ ;
for ( int i= 0 ; i< size; i++ ) {
TreeNode node = queue. poll ( ) ;
if ( node. left!= null ) queue. offer ( node. left) ;
if ( node. right!= null ) queue. offer ( node. right) ;
if ( node. left== null && node. right== null ) {
return res;
}
}
}
return res;
}
}
class Solution {
public boolean isBalanced ( TreeNode root) {
return getHeight ( root) != - 1 ;
}
public static int getHeight ( TreeNode root) {
if ( root== null ) return 0 ;
int count1 = getHeight ( root. left) ;
if ( count1== - 1 ) return - 1 ;
int count2 = getHeight ( root. right) ;
if ( count2== - 1 ) return - 1 ;
int height = Math . max ( count1, count2) ;
return Math . abs ( count1- count2) > 1 ? - 1 : height+ 1 ;
}
}
路径
class Solution {
public List < String > binaryTreePaths ( TreeNode root) {
List < String > ress = new ArrayList ( ) ;
if ( root == null ) return ress;
preOrder ( root, ress, "" ) ;
return ress;
}
public static void preOrder ( TreeNode root, List < String > ress, String res) {
if ( res!= null && ! res. equals ( "" ) ) res+= "->" ;
res+= root. val;
if ( root. left!= null ) preOrder ( root. left, ress, res) ;
if ( root. right!= null ) preOrder ( root. right, ress, res) ;
if ( root. left== null && root. right== null ) {
ress. add ( res) ;
}
}
}
1. 如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值
2. 如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值
3. 如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回
class Solution {
public boolean hasPathSum ( TreeNode root, int targetSum) {
if ( root== null ) return false ;
targetSum -= root. val;
if ( targetSum== 0 && root. left== null && root. right== null ) return true ;
boolean bool1 = hasPathSum ( root. left, targetSum) ;
boolean bool2 = hasPathSum ( root. right, targetSum) ;
return bool1|| bool2;
}
}
class Solution {
public boolean hasPathSum ( TreeNode root, int targetSum) {
if ( root== null ) return false ;
Stack < TreeNode > stack1 = new Stack ( ) ;
Stack < Integer > stack2 = new Stack ( ) ;
stack1. push ( root) ;
stack2. push ( root. val) ;
while ( ! stack1. isEmpty ( ) ) {
int size = stack1. size ( ) ;
while ( size-- > 0 ) {
TreeNode node = stack1. pop ( ) ;
int sum= stack2. pop ( ) ;
if ( node. left== null && node. right== null && sum== targetSum) return true ;
if ( node. left!= null ) {
stack1. push ( node. left) ;
stack2. push ( sum+ node. left. val) ;
}
if ( node. right!= null ) {
stack1. push ( node. right) ;
stack2. push ( sum+ node. right. val) ;
}
}
}
return false ;
}
}
class Solution {
public List < List < Integer > > pathSum ( TreeNode root, int targetSum) {
List < List < Integer > > ress = new ArrayList ( ) ;
if ( root== null ) return ress;
List < Integer > res = new ArrayList ( ) ;
getpathSum ( root, targetSum, res, ress) ;
return ress;
}
public void getpathSum ( TreeNode root, int targetSum, List < Integer > res, List < List < Integer > > ress) {
res. add ( root. val) ;
targetSum -= root. val;
if ( root. left== null && root. right== null ) {
if ( targetSum== 0 ) ress. add ( new ArrayList < > ( res) ) ;
return ;
}
if ( root. left!= null ) {
getpathSum ( root. left, targetSum, res, ress) ;
res. remove ( res. size ( ) - 1 ) ;
}
if ( root. right!= null ) {
getpathSum ( root. right, targetSum, res, ress) ;
res. remove ( res. size ( ) - 1 ) ;
}
}
}
结果和
class Solution {
public int countNodes ( TreeNode root) {
if ( root== null ) return 0 ;
int count1 = countNodes ( root. left) ;
int count2 = countNodes ( root. right) ;
return count1+ count2+ 1 ;
}
}
class Solution {
public int countNodes ( TreeNode root) {
int count = 0 ;
if ( root== null ) return count;
Queue < TreeNode > queue = new LinkedList ( ) ;
queue. offer ( root) ;
while ( ! queue. isEmpty ( ) ) {
int size = queue. size ( ) ;
count += size;
for ( int i= 0 ; i< size; i++ ) {
TreeNode node = queue. poll ( ) ;
if ( node. left!= null ) queue. offer ( node. left) ;
if ( node. right!= null ) queue. offer ( node. right) ;
}
}
return count;
}
}
完全二叉树只有两种情况
1. 满二叉树:2 ^ 数深度- 1
2. 最后一层叶子节点没有满:分别递归左右孩子,直到左右孩子为满二叉树,依然按情况1 处理
class Solution {
public int countNodes ( TreeNode root) {
if ( root== null ) return 0 ;
int leftHeight = 0 , rightHeight = 0 ;
TreeNode left = root. left;
TreeNode right = root. right;
while ( left!= null ) {
left = left. left;
leftHeight++ ;
}
while ( right!= null ) {
right = right. right;
rightHeight++ ;
}
if ( leftHeight == rightHeight) {
return ( 2 << leftHeight) - 1 ;
}
return countNodes ( root. left) + countNodes ( root. right) + 1 ;
}
}
class Solution {
public int sumOfLeftLeaves ( TreeNode root) {
if ( root== null ) return 0 ;
int sum= 0 ;
if ( root. left!= null && root. left. left== null && root. left. right== null ) {
sum += root. left. val;
}
int leftsum = sumOfLeftLeaves ( root. left) ;
int rightsum = sumOfLeftLeaves ( root. right) ;
return leftsum+ rightsum+ sum;
}
}
class Solution {
public int sumOfLeftLeaves ( TreeNode root) {
if ( root== null ) return 0 ;
int sum= 0 ;
Stack < TreeNode > stack = new Stack ( ) ;
stack. push ( root) ;
while ( ! stack. isEmpty ( ) ) {
TreeNode node = stack. pop ( ) ;
if ( node. left!= null && node. left. left== null && node. left. right== null ) {
sum += node. left. val;
}
if ( node. left!= null ) stack. push ( node. left) ;
if ( node. right!= null ) stack. push ( node. right) ;
}
return sum;
}
}
class Solution {
public int sumOfLeftLeaves ( TreeNode root) {
if ( root== null ) return 0 ;
int sum= 0 ;
Queue < TreeNode > queue = new LinkedList ( ) ;
queue. offer ( root) ;
while ( ! queue. isEmpty ( ) ) {
int size = queue. size ( ) ;
while ( size-- > 0 ) {
TreeNode node = queue. poll ( ) ;
if ( node. left!= null ) {
if ( node. left. left== null && node. left. right== null ) {
sum += node. left. val;
} else {
queue. offer ( node. left) ;
}
}
if ( node. right!= null ) queue. offer ( node. right) ;
}
}
return sum;
}
}
class Solution {
private int maxheight = - 1 ;
private int value = 0 ;
public int findBottomLeftValue ( TreeNode root) {
if ( root== null ) return 0 ;
findLeftValue ( root, 0 ) ;
return value;
}
private void findLeftValue ( TreeNode root, int deep) {
if ( root. left== null && root. right== null ) {
if ( deep> maxheight) {
value= root. val;
maxheight= deep;
}
}
if ( root. left!= null ) findLeftValue ( root. left, deep+ 1 ) ;
if ( root. right!= null ) findLeftValue ( root. right, deep+ 1 ) ;
}
}
class Solution {
public int findBottomLeftValue ( TreeNode root) {
if ( root== null ) return 0 ;
int leftOrder = 0 ;
Queue < TreeNode > queue = new LinkedList ( ) ;
queue. offer ( root) ;
while ( ! queue. isEmpty ( ) ) {
int size = queue. size ( ) ;
leftOrder = queue. peek ( ) . val;
while ( size-- > 0 ) {
TreeNode node = queue. poll ( ) ;
if ( node. left!= null ) queue. offer ( node. left) ;
if ( node. right!= null ) queue. offer ( node. right) ;
}
}
return leftOrder;
}
}