算法通关村第八关白银挑战——轻松搞定最大深度问题

大家好,我是怒码少年小码。

接着上一期讲讲递归在二叉树题目中的使用。

求二叉树的最大深度

LeetCode 104:给定一个二叉树 root ,返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

算法通关村第八关白银挑战——轻松搞定最大深度问题_第1张图片

观察这个二叉树,可以得到,结点5的最大深度应该是它左右子树的最大深度 + 1(把自己也算进去)的最大值。那么5的左右子树的最大深度等于啥?

等于4的左右结点的最大深度+1和8的左右结点的最大深度+1的最大值。

看到这我们就能判断出本题可以用递归来做了,那么根据递归三步走,我们现在就要来讨论递归的终止条件了。我们根节点一直往下遍历,知道走到叶子结点了才返回,所以root == nullptr就是终止结点。

int maxDapth(TreeNode* root) {
	if (root == nullptr) {
		return 0;
	}
	return max(maxDapth(root->left), maxDapth(root->right)) + 1;
}

因为递归的终止条件是要在下一次调用的时候判断的,所以我们不能使用root->left == nullptr && root->right == nullptr作为终止条件。例如:如题干所给的例子,遍历到结点2时,如果使用root->left == nullptr && root->right == nullptr,那么结点7进入函数就会被返回0,但是结点2也算在最大深度中的,也需要+1,但是直接返回0了。

如果我们把条件改成root == nullptr就不一样了,遍历到结点2时,结点2本身不为空,继续递归+1,在下一次递归中root更新了成为了空,直接返回0退出。

你可能感兴趣的:(算法学习,算法,数据结构,c++)