【剑指offer】11.二叉树的深度
总目录:
1.问题描述
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。
数据范围:节点的数量满足 0≤n≤100,节点上的值满足 0≤val≤100
进阶:空间复杂度 O(1) ,时间复杂度 O(n)
假如输入的用例为{1,2,3,4,5,#,6,#,#,7},那么如下图:
2.问题分析
这道题的意义其实比较深远,可以引出深度搜索DFS(Deep first search)和广度搜索BFS(Broad first search)两个概念。
1用递归,最方便
2用辅助队列,逐层遍历,将当前层的节点入队,然后迭代队列长度,边迭代边出队,同时将出队节点的子节点入队。每走一层计数器+1,直至队列中无节点
3.代码实例
递归
1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) { 8 } 9 };*/ 10 class Solution { 11 public: 12 int TreeDepth(TreeNode* pRoot) { 13 //中止条件 14 if (!pRoot) { 15 return 0; 16 } 17 18 //递归调用 19 int leftDep = TreeDepth(pRoot->left); 20 int rightDep = TreeDepth(pRoot->right); 21 22 //本层逻辑 23 return leftDep > rightDep ? (leftDep + 1) : (rightDep + 1); 24 } 25 };
队列
1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) { 8 } 9 };*/ 10 class Solution { 11 public: 12 int TreeDepth(TreeNode* pRoot) { 13 //空树 14 if (!pRoot) { 15 return 0; 16 } 17 18 //初始化队列 19 queue<TreeNode*> q; 20 q.push(pRoot); 21 22 //初始化计数器 23 int nodeCount = 0; 24 int depth = 0; 25 26 //逐层迭代 27 while (!q.empty()) { 28 //遍历当前层的所有节点 29 nodeCount = q.size(); 30 for (int i = 0; i < nodeCount; i++) { 31 auto* pNode = q.front(); 32 q.pop(); 33 34 if(pNode->left) q.push(pNode->left); 35 if(pNode->right) q.push(pNode->right); 36 } 37 38 //本层结束,计数器++ 39 depth++; 40 } 41 return depth; 42 } 43 };