2020_7_28

关于树的深度

Preface

不知道大家怎么想树的题,反正叔叔我啊一看见树的题啊,就想起递归了~

关于树的深度呢,其实更准确的说是二叉树,因为只有二叉树比较好出题(不是。是因为二叉树对于查找、压缩方面有巨大应用,当然啦,这里也不过多赘述。

回到主题,讲到深度,其实就是去探索,不断的向下搜索的的过程。那么讲到搜索金额探索,就自然而然想到BFS和DFS两种搜索算法啦。

Solution

104. 二叉树的最大深度
给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回它的最大深度 3 。

看着题,容易写出DFS的版本,递归即可,这里我蠢了,代码不够简洁,其实可以一行即可。。。

#include <iostream>
#include <algorithm>
using namespace std;

struct TreeNode
{
	int val;
	TreeNode *left, *right;
	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

class Solution {
public:
	int max_deep(TreeNode* root, int deep)
	{
		if (root == nullptr)
			return deep;
		else
		{
			auto deep_left = root->left == nullptr ? deep : max_deep(root->left, deep + 1);
			auto deep_right = root->right == nullptr ? deep : max_deep(root->right, deep + 1);
			return max(deep_left, deep_right);
		}
	}
	int maxDepth(TreeNode* root) {
		return root == nullptr ? 0 : max_deep(root, 1);
	}
};

这里相信大家能看出来,没有把condition给提炼出来,多了几个判断,还是很伤的。。。

很简洁的版本在reference部分,我就不在这里展示出来的。

下面重点说说BFS的部分,BFS难点在于记住现在是几层,因为BFS是扩散寻找,所以很难讲我现在就在left和right端对比加一的方法。所以我们另辟蹊径,采取每一次走一层的方法,具体在于我用一个queue,每一阶段所有的queue的里面都是同一层的。理由是,我先放入root(假设不为nullptr),那是不是现在我的root就是一层,那我把现阶段所有的queue都遍历一遍,下一次是不是所有的就在第二层了,以此类推。每次遍历完就加一即可。

#include <iostream>
#include <queue>
using namespace std;

struct TreeNode
{
	int val;
	TreeNode *left, *right;
	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

class Solution {
public:
	int maxDepth(TreeNode* root) {
		queue<TreeNode*> q;
		auto res = 0;
		if (root != nullptr)  q.push(root);
		while (q.empty())
		{
			auto size = static_cast<int>(q.size());
			while (size-- > 0)
			{
				auto top = q.front();
				q.pop();
				if (top->left != nullptr) q.push(top->left);
				if (top->right != nullptr) q.push(top->right);
			}
			++res;
		}
		return res;
	}
};

Reference

题目

官阶

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值