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;
}
}
第94题 二叉树的中序遍历
递归实现
public List < Integer > inorderTraversal ( TreeNode root) {
ArrayList < Integer > integers = new ArrayList < > ( ) ;
inorderTraversalImplement ( integers, root) ;
return integers;
}
public void inorderTraversalImplement ( List < Integer > integers, TreeNode root) {
if ( root == null ) return ;
if ( root. left != null ) {
inorderTraversalImplement ( integers, root. left) ;
}
integers. add ( root. val) ;
if ( root. right != null ) {
inorderTraversalImplement ( integers, root. right) ;
}
}
非递归实现
public List < Integer > inorderTraversalFeiDiGui ( TreeNode root) {
if ( root == null ) return new ArrayList < Integer > ( ) ;
List < Integer > integers = new ArrayList < > ( ) ;
Stack < TreeNode > treeNodes1 = new Stack < > ( ) ;
while ( ! treeNodes1. isEmpty ( ) || root != null ) {
if ( root != null ) {
treeNodes1. push ( root) ;
root = root. left;
} else {
root = treeNodes1. pop ( ) ;
integers. add ( root. val) ;
root = root. right;
}
}
return integers;
}
第101题 对称二叉树
public boolean isSymmetric ( TreeNode root) {
if ( root == null ) return true ;
return isSymmetricImplement ( root. left, root. right)
}
public boolean isSymmetricImplement ( TreeNode left, TreeNode right) {
if ( left == null && right == null ) {
return true ;
}
if ( left == null || right == null ) {
return false ;
}
if ( left. val != right. val) {
return false ;
}
return isSymmetricImplement ( left. left, right. right) && isSymmetricImplement ( left. right, right. left) ;
}
第102题 二叉树的层序遍历
public List < List < Integer > > levelOrder ( TreeNode root) {
if ( root == null ) {
return new ArrayList < > ( ) ;
}
LinkedList < TreeNode > queue = new LinkedList < > ( ) ;
List < List < Integer > > result = new ArrayList < > ( ) ;
queue. push ( root) ;
while ( ! queue. isEmpty ( ) ) {
LinkedList < TreeNode > newQueue = new LinkedList < > ( ) ;
ArrayList < Integer > integers = new ArrayList < > ( ) ;
while ( ! queue. isEmpty ( ) ) {
TreeNode current = queue. poll ( ) ;
integers. add ( current. val) ;
if ( current. left != null ) {
newQueue. add ( current. left) ;
}
if ( current. right != null ) {
newQueue. add ( current. right) ;
}
}
queue = newQueue;
result. add ( integers) ;
}
return result;
}
第104题 二叉树的最大深度
public int maxDepth ( TreeNode root) {
if ( root == null ) {
return 0 ;
}
LinkedList < TreeNode > queue = new LinkedList < > ( ) ;
int result = 0 ;
queue. push ( root) ;
while ( ! queue. isEmpty ( ) ) {
LinkedList < TreeNode > newQueue = new LinkedList < > ( ) ;
while ( ! queue. isEmpty ( ) ) {
TreeNode current = queue. poll ( ) ;
if ( current. left != null ) {
newQueue. add ( current. left) ;
}
if ( current. right != null ) {
newQueue. add ( current. right) ;
}
}
result++ ;
queue = newQueue;
}
return result;
}
第106题 从中序和后序遍历序列构造二叉树
public TreeNode buildTree ( int [ ] inorder, int [ ] postorder) {
return buildTreeImplement ( inorder, postorder) ;
}
public TreeNode buildTreeImplement ( int [ ] inorder, int [ ] postorder) {
if ( inorder. length == 0 ) return null ;
int last = postorder[ postorder. length - 1 ] ;
int [ ] leftInorder = null , leftPostOrder = null ;
int [ ] rightInorder = null , rightPostorder = null ;
TreeNode root = null , left = null , right = null ;
for ( int i = 0 ; i < inorder. length; i++ ) {
if ( inorder[ i] == last) {
leftInorder = Arrays . copyOf ( inorder, i) ;
rightInorder = new int [ inorder. length- 1 - i] ;
System . arraycopy ( inorder, i+ 1 , rightInorder, 0 , inorder. length- 1 - i) ;
leftPostOrder = Arrays . copyOf ( postorder, i) ;
rightPostorder = new int [ postorder. length- 1 - i] ;
System . arraycopy ( postorder, i, rightPostorder, 0 , postorder. length- 1 - i) ;
left = buildTreeImplement ( leftInorder, leftPostOrder) ;
right = buildTreeImplement ( rightInorder, rightPostorder) ;
root = new TreeNode ( ) ;
root. val = last;
root. left = left;
root. right = right;
break ;
}
}
return root;
}
第107题 二叉树的层序遍历 II
public List < List < Integer > > levelOrder ( TreeNode root) {
if ( root == null ) {
return new ArrayList < > ( ) ;
}
LinkedList < TreeNode > queue = new LinkedList < > ( ) ;
List < List < Integer > > result = new ArrayList < > ( ) ;
queue. push ( root) ;
while ( ! queue. isEmpty ( ) ) {
LinkedList < TreeNode > newQueue = new LinkedList < > ( ) ;
ArrayList < Integer > integers = new ArrayList < > ( ) ;
while ( ! queue. isEmpty ( ) ) {
TreeNode current = queue. poll ( ) ;
integers. add ( current. val) ;
if ( current. left != null ) {
newQueue. add ( current. left) ;
}
if ( current. right != null ) {
newQueue. add ( current. right) ;
}
}
queue = newQueue;
result. add ( 0 , integers) ;
}
return result;
}
第110题 平衡二叉树
public boolean isBalanced ( TreeNode root) {
if ( root == null ) return true ;
return isBalancedImplement ( root) != - 1 ;
}
public int isBalancedImplement ( TreeNode root) {
if ( root == null ) return 0 ;
if ( root. left == null && root. right == null ) return 1 ;
int leftHeight = isBalancedImplement ( root. left) ;
int rightHeight = isBalancedImplement ( root. right) ;
if ( leftHeight == - 1 || rightHeight == - 1 ) return - 1 ;
if ( Math . abs ( leftHeight- rightHeight) <= 1 ) {
return ( leftHeight > rightHeight) ? leftHeight+ 1 : rightHeight+ 1 ;
}
return - 1 ;
}
第111题 二叉树的最小深度
public int minDepth ( TreeNode root) {
if ( root == null ) {
return 0 ;
}
LinkedList < TreeNode > queue = new LinkedList < > ( ) ;
int result = 0 ;
queue. push ( root) ;
while ( ! queue. isEmpty ( ) ) {
LinkedList < TreeNode > newQueue = new LinkedList < > ( ) ;
while ( ! queue. isEmpty ( ) ) {
TreeNode current = queue. poll ( ) ;
if ( current. left == null && current. right == null ) {
return result + 1 ;
}
if ( current. left != null ) {
newQueue. add ( current. left) ;
}
if ( current. right != null ) {
newQueue. add ( current. right) ;
}
}
result++ ;
queue = newQueue;
}
return result;
}
第112题 路径总和
public boolean hasPathSum ( TreeNode root, int targetSum) {
return hasPathSumImplement ( root, targetSum, 0 ) ;
}
public boolean hasPathSumImplement ( TreeNode root, int targetSum, int currentSum) {
if ( root == null ) return false ;
if ( root. left == null && root. right == null && ( currentSum + root. val) == targetSum) return true ;
boolean left = false , right = false ;
left = hasPathSumImplement ( root. left, targetSum, currentSum+ root. val) ;
right = hasPathSumImplement ( root. right, targetSum, currentSum+ root. val) ;
return left || right;
}
第116题 填充每个节点的下一个右侧节点指针
public Node connect ( Node root) {
if ( root == null ) {
return root;
}
LinkedList < Node > queue = new LinkedList < > ( ) ;
queue. push ( root) ;
while ( ! queue. isEmpty ( ) ) {
LinkedList < Node > newQueue = new LinkedList < > ( ) ;
Node pre = queue. poll ( ) ;
if ( pre. left != null ) {
newQueue. add ( pre. left) ;
}
if ( pre. right != null ) {
newQueue. add ( pre. right) ;
}
Node current = null ;
while ( ! queue. isEmpty ( ) ) {
current = queue. poll ( ) ;
pre. next = current;
pre = current;
if ( current. left != null ) {
newQueue. add ( current. left) ;
}
if ( current. right != null ) {
newQueue. add ( current. right) ;
}
}
if ( current != null ) {
current. next = null ;
}
queue = newQueue;
}
return root;
}
第144题 二叉树的前序遍历
递归实现
public List < Integer > preorderTraversal ( TreeNode root) {
List < Integer > integers = new ArrayList < > ( ) ;
preorderTraversalImplement ( integers, root) ;
return integers;
}
public void preorderTraversalImplement ( List < Integer > integers, TreeNode root) {
if ( root == null ) return ;
integers. add ( root. val) ;
preorderTraversalImplement ( integers, root. left) ;
preorderTraversalImplement ( integers, root. right) ;
}
非递归实现
public List < Integer > preorderTraversalFeiDiGui ( TreeNode root) {
if ( root == null ) return new ArrayList < Integer > ( ) ;
List < Integer > integers = new ArrayList < > ( ) ;
Stack < TreeNode > treeNodes = new Stack < > ( ) ;
treeNodes. add ( root) ;
while ( ! treeNodes. isEmpty ( ) ) {
root = treeNodes. pop ( ) ;
integers. add ( root. val) ;
System . out. println ( root. val) ;
if ( root. right != null ) {
treeNodes. push ( root. right) ;
}
if ( root. left != null ) {
treeNodes. push ( root. left) ;
}
}
return integers;
}
第145题 二叉树的后序遍历
递归实现
public List < Integer > postorderTraversal ( TreeNode root) {
ArrayList < Integer > integers = new ArrayList < > ( ) ;
postorderTraversalImplement ( integers, root) ;
return integers;
}
public void postorderTraversalImplement ( List < Integer > integers, TreeNode root) {
if ( root == null ) return ;
postorderTraversalImplement ( integers, root. left) ;
postorderTraversalImplement ( integers, root. right) ;
integers. add ( root. val) ;
}
非递归实现
public List < Integer > postorderTraversalFeiDiGui ( TreeNode root) {
if ( root == null ) return new ArrayList < Integer > ( ) ;
List < Integer > integers = new ArrayList < > ( ) ;
Stack < TreeNode > treeNodes1 = new Stack < > ( ) ;
Stack < TreeNode > treeNodes2 = new Stack < > ( ) ;
treeNodes1. push ( root) ;
while ( ! treeNodes1. isEmpty ( ) ) {
TreeNode current = treeNodes1. pop ( ) ;
treeNodes2. push ( current) ;
if ( current. left != null ) {
treeNodes1. push ( current. left) ;
}
if ( current. right != null ) {
treeNodes1. push ( current. right) ;
}
}
while ( ! treeNodes2. isEmpty ( ) ) {
integers. add ( treeNodes2. pop ( ) . val) ;
}
return integers;
}
第199题 二叉树的右视图
public List < Integer > rightSideView ( TreeNode root) {
if ( root == null ) {
return new ArrayList < > ( ) ;
}
LinkedList < TreeNode > queue = new LinkedList < > ( ) ;
List < Integer > result = new ArrayList < > ( ) ;
queue. push ( root) ;
while ( ! queue. isEmpty ( ) ) {
LinkedList < TreeNode > newQueue = new LinkedList < > ( ) ;
int val = 0 ;
while ( ! queue. isEmpty ( ) ) {
TreeNode current = queue. poll ( ) ;
val = current. val;
if ( current. left != null ) {
newQueue. add ( current. left) ;
}
if ( current. right != null ) {
newQueue. add ( current. right) ;
}
}
result. add ( val) ;
queue = newQueue;
}
return result;
}
第226题 翻转二叉树
public TreeNode invertTree ( TreeNode root) {
invertTreeImplement ( root) ;
return root;
}
public void invertTreeImplement ( TreeNode root) {
if ( root == null ) return ;
TreeNode swap = root. left;
root. left = root. right;
root. right = swap;
if ( root. left != null ) {
invertTreeImplement ( root. left) ;
}
if ( root. right != null ) {
invertTreeImplement ( root. right) ;
}
}
第257题
public List < String > binaryTreePaths ( TreeNode root) {
List < String > paths = new ArrayList < String > ( ) ;
constructPaths ( root, "" , paths) ;
return paths;
}
public void constructPaths ( TreeNode root, String path, List < String > paths) {
if ( root != null ) {
StringBuffer pathSB = new StringBuffer ( path) ;
pathSB. append ( Integer . toString ( root. val) ) ;
if ( root. left == null && root. right == null ) {
paths. add ( pathSB. toString ( ) ) ;
} else {
pathSB. append ( "->" ) ;
constructPaths ( root. left, pathSB. toString ( ) , paths) ;
constructPaths ( root. right, pathSB. toString ( ) , paths) ;
}
}
}
第404题 左叶子之和
public int sumOfLeftLeaves ( TreeNode root) {
return sumOfLeftLeavesImplents ( root) ;
}
public int sumOfLeftLeavesImplents ( TreeNode node) {
if ( node == null ) return 0 ;
int left = 0 , right = 0 ;
right = sumOfLeftLeavesImplents ( node. right) ;
if ( node. left != null && node. left. left == null && node. left. right == null ) left = node. left. val;
left += sumOfLeftLeavesImplents ( node. left) ;
return left+ right;
}
第429题 N叉树的层序遍历
public List < List < Integer > > levelOrder ( Node root) {
if ( root == null ) {
return new ArrayList < > ( ) ;
}
LinkedList < Node > queue = new LinkedList < > ( ) ;
List < List < Integer > > result = new ArrayList < > ( ) ;
queue. push ( root) ;
while ( ! queue. isEmpty ( ) ) {
LinkedList < Node > newQueue = new LinkedList < > ( ) ;
ArrayList < Integer > integers = new ArrayList < > ( ) ;
while ( ! queue. isEmpty ( ) ) {
Node current = queue. poll ( ) ;
integers. add ( current. val) ;
newQueue. addAll ( current. children) ;
}
queue = newQueue;
result. add ( integers) ;
}
return result;
}
第513题 找树左下角的值
public int findBottomLeftValue ( TreeNode root) {
if ( root == null ) return 0 ;
LinkedList < TreeNode > queue = new LinkedList < > ( ) ;
int result = 0 ;
queue. push ( root) ;
while ( ! queue. isEmpty ( ) ) {
LinkedList < TreeNode > newQueue = new LinkedList < > ( ) ;
int count = 0 ;
while ( ! queue. isEmpty ( ) ) {
TreeNode currentNode = queue. poll ( ) ;
if ( count == 0 ) {
result = currentNode. val;
}
count++ ;
if ( currentNode. left != null ) {
newQueue. add ( currentNode. left) ;
}
if ( currentNode. right != null ) {
newQueue. add ( currentNode. right) ;
}
}
queue = newQueue;
}
return result;
}
第515题 在每个树行中找最大值
public List < Integer > largestValues ( TreeNode root) {
if ( root == null ) {
return new ArrayList < > ( ) ;
}
LinkedList < TreeNode > queue = new LinkedList < > ( ) ;
List < Integer > result = new ArrayList < > ( ) ;
queue. push ( root) ;
while ( ! queue. isEmpty ( ) ) {
LinkedList < TreeNode > newQueue = new LinkedList < > ( ) ;
Integer max = Integer . MIN_VALUE ;
while ( ! queue. isEmpty ( ) ) {
TreeNode current = queue. poll ( ) ;
if ( current. val > max) {
max = current. val;
}
if ( current. left != null ) {
newQueue. add ( current. left) ;
}
if ( current. right != null ) {
newQueue. add ( current. right) ;
}
}
result. add ( max) ;
queue = newQueue;
}
return result;
}
第637题 二叉树的层平均值
public List < Double > averageOfLevels ( TreeNode root) {
if ( root == null ) {
return new ArrayList < > ( ) ;
}
LinkedList < TreeNode > queue = new LinkedList < > ( ) ;
List < Double > result = new ArrayList < > ( ) ;
queue. push ( root) ;
while ( ! queue. isEmpty ( ) ) {
LinkedList < TreeNode > newQueue = new LinkedList < > ( ) ;
double count = 0 ;
int num = 0 ;
while ( ! queue. isEmpty ( ) ) {
TreeNode current = queue. poll ( ) ;
count += current. val;
num++ ;
if ( current. left != null ) {
newQueue. add ( current. left) ;
}
if ( current. right != null ) {
newQueue. add ( current. right) ;
}
}
result. add ( count / num) ;
queue = newQueue;
}
return result;
}