遍历二叉树所能求得的属性
通过先序 or 中序 or 后序 or 层序(BFS 和 DFS)遍历
方式能求的一棵树的 深度
,路径
,判断二叉树是否对称,平衡等
,叶子节点之和
等属性
自底到顶 DFS
& 自顶到底 BFS
110.平衡二叉树
110.平衡二叉树
自低到顶
为此题最优解法分别递归左右子树
若左右子树高度差大于1,则返回-1 否则返回以该根节点的左右子树高度差 var isBalanced = function ( root ) {
function recur ( node ) {
if ( ! root) return 0 ;
let leftDepth = recur ( node. left) ;
if ( leftDepth == - 1 ) return - 1 ;
let rightDepth = recur ( node. right) ;
if ( rightDepth == - 1 ) return - 1 ;
return Math. abs ( leftDepth - rightDepth) < 2 ? Math. max ( leftDepth, rightDepth) + 1 : - 1 ;
}
return recur ( root) != - 1 ;
}
104.二叉树的最大深度
104.二叉树的最大深度
利用DFS或BFS遍历二叉树的同时,记录最大深度即可
var maxDepth = function ( root ) {
function maxRaceDepth ( node, level ) {
if ( ! node) return 0 ;
return Math. max ( maxRaceDepth ( node. left, level) , maxRaceDepth ( node. right, level) ) + 1 ;
}
return maxRaceDepth ( root, 0 ) ;
}
var maxDepth = function ( root ) {
let queue = [ ] ;
if ( root) queue. push ( root) ;
while ( queue. length > 0 ) {
let levelSize = queue. length;
for ( let i = 0 ; i < levelSize; i ++ ) {
let node = queue. shift ( ) ;
node. left && queue. push ( node. left) ;
node. right && queue. push ( node. right) ;
}
maxRoot ++ ;
}
return maxRoot;
}
111.二叉树的最小深度
var minDepth = function ( root ) {
if ( ! root) return 0 ;
if ( ! root. left && ! root. right) return 1 ;
let leftDepth = minDepth ( root. left) ;
let rightDepth = minDepth ( root. right) ;
return root. left === null || root. right === null ?
leftDepth + rightDepth + 1 : Math. min ( leftDepth, rightDepth) + 1 ;
} ;
101.对称二叉树
101.对称二叉树
注意递归配合 逻辑运算符的使用
实现(无敌)
root.left.val === root.right.val root.left.left.val === root.right.right.val root.left.right.val === root.right.left.val var isSymmetric1 = function ( root ) {
if ( ! root) return true ;
let leftStack = [ root. left] ;
let rightStack = [ root. right] ;
do {
let leftNode = leftStack. pop ( ) ;
let rightNode = rightStack. pop ( ) ;
if ( leftNode === null && rightNode === null ) continue ;
if ( leftNode === null || rightNode === null || leftNode. val !== rightNode. val) return false ;
leftStack. push ( leftNode. left) ;
leftStack. push ( leftNode. right) ;
rightStack. push ( rightNode. right) ;
rightStack. push ( rightNode. left) ;
} while ( leftStack. length > 0 && rightStack. length > 0 ) ;
return true ;
} ;
var isSymmetric2 = function ( root ) {
function judgeTree ( leftNode, rightNode ) {
if ( leftNode === null && rightNode === null ) return true ;
if ( leftNode === null || rightNode === null || leftNode. val !== rightNode. val ) return false ;
return judgeTree ( leftNode. left, rightNode. right) && judgeTree ( leftNode. right, rightNode. left) ;
}
return judgeTree ( root. left, root. right) ;
}
257.二叉树的所有路径
257.二叉树的所有路径
var binaryTreePaths = function ( root ) {
if ( ! root) return [ ] ;
if ( ! root. left && ! root. right) return [ String ( root. val) ] ;
let res = [ ] ;
function allPath ( node, path ) {
if ( ! node. left && ! node. right) {
res. push ( path) ;
return null ;
}
node. left && ( node. left, path + "->" + node. left. val) ;
node. right && ( node. right, path + "->" + node. right. val) ;
}
allPath ( root, String ( root. val) ) ;
return res;
}
var binaryTreePaths = function ( root ) {
let queue_path = [ ] ;
let queue_node = [ ] ;
let res = [ ] ;
queue_node. push ( root) ;
queue_path. push ( String ( root. val) ) ;
while ( queue_node. length > 0 ) {
let node = queue_node. shift ( ) ;
let path = queue_path. shift ( ) ;
if ( ! node. left && ! node. right) {
res. push ( path) ;
} else {
if ( node. left) {
queue_node. push ( node. left) ;
queue_path. push ( path + "->" + node. left. val) ;
}
if ( node. right) {
queue_node. push ( node. right) ;
queue_path. push ( path + "->" + node. right. val) ;
}
}
}
return res;
}
404.左叶子之和
513.找到左下角的值
112.路径总和
112.路径总和 var hasPathSum = function ( root, targetSum ) {
if ( ! root) return false ;
let queue_node = [ ] ;
let sum_queue = [ ] ;
queue_node. push ( root) ;
sum_queue. push ( root. val) ;
while ( queue_node. length > 0 ) {
let node = queue_node. shift ( ) ;
let sum = sum_queue. shift ( ) ;
if ( ! node. left && ! node. right && sum === targetSum) {
return true ;
} else {
if ( node. left) {
queue_node. push ( node. left) ;
sum_queue. push ( sum + node. left. val) ;
}
if ( node. right) {
queue_node. push ( node. right) ;
sum_queue. push ( sum + node. right. val) ;
}
}
}
return false ;
}
总结
凡是 求二叉树的属性
:路径,路径和,深度,节点数,最左叶子节点,最右叶子节点,左叶子之和,右叶子之和,对称二叉树等,都是通过 遍历二叉树
,并在 途中记录信息
从而 得到
而遍历二叉树除了前,中,后序遍历外,还有层级遍历,而相应的BFS,DFS搜索算法也很常用
(需要掌握它们的 递归,迭代
实现)