剑指 offer 55.二叉树的深度
就是给你一个二叉树,求出这个数的深度,很明显,这里说的是最大深度。
比如下面的这棵树的深度是 4
。
方法一:递归
二叉树的题目会大量使用递归来解决,之前我们也涉及过递归,但是二叉树的递归往往比链表的难思考很多,注意,这里说的难思考,其实并不是解题思路很难思考出来,比如本题,很明显对整棵树从根节点进行递归,递归的终止条件为节点为 null,返回一个 0,然后向上返回数值,比较左右数值的大小,就可以将最大的深度返回。可能一开始看这个思路也会比较难,但是二叉树的题目做多了就会有感觉。
但是为什么说难思考?就是因为节点太多,如果你死看着每一个节点来分析题目,大概率陷进去。
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function TreeDepth(pRoot)
{
// write code here
const getDepth = (pRoot) => {
if(pRoot === null) return 0
let a = getDepth(pRoot.left)
let b = getDepth(pRoot.right)
let depth = 1 + Math.max(a,b)
return depth
}
return getDepth(pRoot)
}
module.exports = {
TreeDepth : TreeDepth
};
建议:用笔画,技巧就是横过来画,横过来画我感觉更有有发散的感觉。
方法二:层序遍历
层序遍历就是将二叉树的每一层提取成数组:
所以很明显,如果我们需要求取二叉树的深度,只需要返回层序遍历结果数组的长度即可,像上面,如果二叉树有4层,层序遍历的结果数组长度也就是4。
代码:
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function TreeDepth(pRoot) {
// 二叉树的层序遍历
const levelOrder = (root) => {
let stack = [];
let res = [];
if (root === null) return res;
stack.push(root);
while (stack.length) {
let size = stack.length;
let arr = [];
for (let i = 0; i < size; i++) {
let node = stack.shift();
arr.push(node.val);
node.left && stack.push(node.left);
node.right && stack.push(node.right);
}
res.push(arr);
}
return res;
};
const res = levelOrder(pRoot)
return res.length
}
module.exports = {
TreeDepth: TreeDepth,
};
层序遍历的思路并不复杂,需要记住,很多题目都会用到。