一、题目描述
JZ38二叉树的深度
题目大意:给定一棵二叉树,求该数的高度
二、算法1(自底向上递归)
算法思路
1.总体思路:根据题意,树的深度是从根节点到叶子结点的所有路径中最长路径的长度,要到达叶子结点,要么走左子树要么走右子树,因此对于以某个结点为根节点构成的子树来说,它所表示的二叉树的深度就是以它右儿子为根的子树的深度+1和以它左儿子为根的子树的深度+1中的最大值
2.实现细节:对于空结点,它的深度为0,自底向上递归,即先递归到最底部,再逐步返回最优值至上层结点,还有一种写法是自顶向下递归,读者可以尝试写一下
代码实现(C++11)
class Solution { public: int TreeDepth(TreeNode* pRoot) { return dfs(pRoot); } int dfs(TreeNode* root){ if(!root) return 0; int left = dfs(root->left); int right = dfs(root->right); return max(left, right) + 1; } };
时间复杂度:O(n)
空间复杂度:O(n)
三、算法2(BFS层序遍历)
算法思路
1.总体思路:层序遍历的遍历顺序是对数的结点一层一层遍历的,因此遍历的层数其实就是数的深度了
2.实现方法:用一个变量记录当前的深度,每次队列中存放的都是某一层的所有结点,每个结点出队时都尝试加入新的子节点进来
代码实现(C++11)
class Solution { public: int TreeDepth(TreeNode* pRoot) { if(!pRoot) return 0; return bfs(pRoot); } int bfs(TreeNode* root){ queue<TreeNode*> q; q.push(root); int depth = 0; while(q.size()){ int s = q.size(); // 当前层数的结点数 ++depth; for(int i = 0; i < s; i++){ TreeNode* fa = q.front(); q.pop(); if(fa->left) q.push(fa->left); if(fa->right) q.push(fa->right); } } return depth; } };
时间复杂度:O(n)
空间复杂度:O(n)