代码随想录算法训练营第15天|层序遍历,226.翻转二叉树,101.堆成二叉树
一. 二叉树相关算法题
102.二叉树的层序遍历
思路
class Solution {
public List < List < Integer > > levelOrder ( TreeNode root) {
Deque < TreeNode > deque = new LinkedList < > ( ) ;
if ( root != null ) deque. push ( root) ;
List < List < Integer > > list = new ArrayList < > ( ) ;
while ( ! deque. isEmpty ( ) ) {
int size = deque. size ( ) ;
List < Integer > temp = new ArrayList < > ( ) ;
while ( size-- > 0 ) {
TreeNode node = deque. pollLast ( ) ;
temp. add ( node. val) ;
if ( node. left != null )
deque. push ( node. left) ;
if ( node. right != null )
deque. push ( node. right) ;
}
list. add ( temp) ;
}
return list;
}
}
226.翻转二叉树
递归法
思路
class Solution {
public TreeNode invertTree ( TreeNode root) {
invertChild ( root) ;
return root;
}
public void invertChild ( TreeNode cur) {
if ( cur == null ) return ;
TreeNode temp = cur. left;
cur. left = cur. right;
cur. right = temp;
invertChild ( cur. left) ;
invertChild ( cur. right) ;
}
}
101.对称二叉树
递归法
思路
可以简化抽象为判断两个子树是否对称 两个子树是否对称的话可以拆解为左右子树的的外层和内层相同 由此递归可以拆分如下:
递归出入参:入参,左右子树根节点;出参,是否相等布尔值 递归终止条件:左右节点为空或则不相等
if ( left == null && right != null ) return false ;
else if ( left != null && right == null ) return false ;
else if ( left== null && right == null ) return true ;
else if ( left. val != right. val ) return false ;
单层递归逻辑:左右子树根节点相等时判断相应子树内外节点是否相等
boolean outside = compare ( left. left, right. right) ;
boolean inside = compare ( left. right, right. left) ;
return outside & inside;
class Solution {
public boolean isSymmetric ( TreeNode root) {
if ( root== null ) return true ;
return compare ( root. left, root. right) ;
}
boolean compare ( TreeNode left, TreeNode right) {
if ( left == null && right != null ) return false ;
else if ( left != null && right == null ) return false ;
else if ( left== null && right == null ) return true ;
else if ( left. val != right. val ) return false ;
boolean outside = compare ( left. left, right. right) ;
boolean inside = compare ( left. right, right. left) ;
return outside & inside;
}
}