洛谷 P4913 【深基16.例3】二叉树深度

【题目链接】

洛谷 P4913 【深基16.例3】二叉树深度

【题目考点】

1. 二叉树

【解题思路】

解法1:递归

  • 递归问题:求一棵二叉树的深度
  • 递归关系:一棵二叉树的深度,是其左子树深度和右子树深度的较大值再加1。
  • 递归出口:一棵空树的深度为0

解法2:深搜

搜索时,带一个参数表示当前的层数,每搜索深入一层,该层数加1。如果该结点是叶子结点,那么更新最大层次数(也可以搜索到任意结点时都一次更新),最后输出最大层次数。

【题解代码】

解法1:递归

#include <bits/stdc++.h>
using namespace std;
#define N 1000005
struct Node
{
    
    
	int left, right;
};
Node tree[N];
int p;
int getDepth(int r)
{
    
    
	if(r == 0)
		return 0;
	return max(getDepth(tree[r].left), getDepth(tree[r].right)) + 1;
}
int main()
{
    
    
	int n;
	cin >> n;
	for(int i = 1; i <= n; ++i)
		cin >> tree[i].left >> tree[i].right;
	cout << getDepth(1);
	return 0;
}

解法2:深搜

  • 写法1:搜索到叶子结点时更新最大深度
#include <bits/stdc++.h>
using namespace std;
#define N 1000005
struct Node
{
    
    
	int left, right;
};
Node tree[N];
int p, mxDepth;//mxDepth:最大深度 
void dfs(int r, int depth)//搜索到地址为r的结点时,深度为depth 
{
    
    
	if(r == 0)
		return;
	if(tree[r].left == 0 && tree[r].right == 0)//如果地址为r的结点是叶子结点,那么更新最大深度 
	{
    
    
		mxDepth = max(mxDepth, depth);
		return;
	}
	dfs(tree[r].left, depth+1);
	dfs(tree[r].right, depth+1);
}
int main()
{
    
    
	int n;
	cin >> n;
	for(int i = 1; i <= n; ++i)
		cin >> tree[i].left >> tree[i].right;
	dfs(1, 1);//根结点深度为1
	cout << mxDepth; 
	return 0;
}
  • 写法2:搜索到任意结点时都更新最大深度
#include <bits/stdc++.h>
using namespace std;
#define N 1000005
struct Node
{
    
    
	int left, right;
};
Node tree[N];
int p, mxDepth;//mxDepth:最大深度 
void dfs(int r, int depth)//搜索到地址为r的结点时,深度为depth 
{
    
    
	if(r == 0)
		return;
	mxDepth = max(mxDepth, depth);//更新最大深度 
	dfs(tree[r].left, depth+1);
	dfs(tree[r].right, depth+1);
}
int main()
{
    
    
	int n;
	cin >> n;
	for(int i = 1; i <= n; ++i)
		cin >> tree[i].left >> tree[i].right;
	dfs(1, 1);//根结点深度为1
	cout << mxDepth; 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lq1990717/article/details/128536694
今日推荐