剑指Offer - 九度1350 - 二叉树的深度
2013-11-23 01:04
381 查看
剑指Offer - 九度1350 - 二叉树的深度 2013-11-23 00:54
题目描述:
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
输入:
第一行输入有n,n表示结点数,结点号从1到n。根结点为1。 n <= 10。
接下来有n行,每行有两个个整型a和b,表示第i个节点的左右孩子孩子。a为左孩子,b为右孩子。当a为-1时,没有左孩子。当b为-1时,没有右孩子。
输出:
输出一个整型,表示树的深度。
样例输入:
3 2 3 -1 -1 -1 -1
样例输出:
2
题意分析: 题目要求求出二叉树的深度,也就是根节点到最远叶结点的长度。思路很清楚,DFS。 递归关系为:
max_depth(NULL) = 0; max_depth(r) = max(max_depth(r->left), max_depth(r->right)) + 1;
实际上由于树的节点个数一开始就指定了,所以直接用数组存数据,用下标当指针就行了,coding更方便。题目中节点数n的数据范围居然只有10,我都怀疑应该是10000或者1000错写成10了。 但有一点要注意,根节点如果不指定为1的话,是需要我们自己去判断哪个是根节点的。对于任何树结构,都只有根节点的入度为零,因为没有节点指向根节点。找出根节点才能去递归。 每个节点遍历一次,时间复杂度O(n)。节点数据都要存起来,空间复杂度O(n)。
// 654348 zhuli19901106 1350 Accepted 点击此处查看所有case的执行结果 1020KB 982B 0MS // 201311210410 #include <cstdio> using namespace std; int mymax(const int &a, const int &b) { return a > b ? a : b; } int max_depth(const int a[][2], int r) { if(a == NULL || r < 0){ return 0; } return mymax(max_depth(a, a[r][0]), max_depth(a, a[r][1])) + 1; } int main() { const int MAXN = 20; int a[MAXN][2]; int in_degree[MAXN]; int i, n; while(scanf("%d", &n) == 1){ if(n < 1){ printf("0\n"); continue; } for(i = 1; i <= n; ++i){ in_degree[i] = 0; } for(i = 1; i <= n; ++i){ scanf("%d%d", &a[i][0], &a[i][1]); if(a[i][0] >= 1 && a[i][0] <= n){ ++in_degree[a[i][0]]; } if(a[i][1] >= 1 && a[i][1] <= n){ ++in_degree[a[i][1]]; } } for(i = 1; i <= n; ++i){ if(in_degree[i] == 0){ break; } } printf("%d\n", max_depth(a, i)); } return 0; }
相关文章推荐
- 【剑指Offer面试编程题】 题目1350:二叉树的深度--九度OJ
- 【剑指Offer面试编程题】 题目1350:二叉树的深度--九度OJ
- 【剑指offer-解题系列(39)】二叉树的深度
- 剑指offer-第六章面试中的各项能力(二叉树的深度)
- 剑指Offer-面试题39-二叉树的深度
- 剑指Offer面试题39(Java版):二叉树的深度
- 【剑指offer】题39:二叉树的深度
- 剑指offer-二叉树深度
- 剑指offer 二叉树的深度
- (C++)剑指offer-38:二叉树的深度(知识迁移能力)
- 【剑指offer】二叉树深度
- 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径
- 【剑指offer】之二叉树深度
- 剑指offer 面试题39 二叉树的深度
- 剑指offer_二叉树---二叉树的深度
- 剑指offer——面试题39:二叉树的深度(递归二叉树,广度优先搜索)
- 剑指Offer 39题 二叉树的深度 && 判断平衡二叉树 Java版
- 【剑指offer】二叉树的深度
- [剑指offer]二叉树深度vs判断平衡二叉树
- 剑指offer-二叉树的深度