版权声明:本文为博主原创文章,若要转载注明出处即可,欢迎分享! https://blog.csdn.net/qq_41822235/article/details/82049242
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
有几个想法,暂时没有实现,先放在这里。
将二叉树看成是有向带权图,节点间的权值统统假设为1,根结点视为有向图的起点。利用算法(如Dijkstra算法)求出根结点到其余各节点的最短路径,所有最短路径中最大值+1即为二叉树的深度;
利用哈希表,建立<地址,深度>的联系;下一层的深度是上一层的深度+1,直到二叉树遍历完成(深度优先或广度优先、广度优先又称层序遍历),选出最大深度;
通过揣摩上述两种思路,我意识到仅仅为了求出深度而算出每个节点所在的层次是没有必要的。但是,思路的提出不是一蹴而就的,上述思路应对本题不是太合适,但开阔眼界勇于迎接挑战是没有错的。而且,思路2可以启发很多思路:比如建立线索二叉树或二叉树结构设计的时候------增加一个域专门记录层次,这样的话,只需要遍历就可以了。
先给出两种经典解法:
一、 层次遍历(又称迭代)
class Solution {
public:
int TreeDepth(TreeNode* pRoot)
{
if(!pRoot)
return 0;
int depth = 0;
queue<TreeNode *>que;
que.push(pRoot);
while(!que.empty())
{
depth++;
int size = que.size(); //层序遍历
for(int i = 0; i < size; ++i)
{
TreeNode * tmp = que.front();
que.pop();
if(tmp -> left)que.push(tmp -> left);
if(tmp -> right)que.push(tmp -> right);
}
}
return depth;
}
};
二、 递归
class Solution {
public:
int TreeDepth(TreeNode* pRoot)
{
return pRoot?max(TreeDepth(pRoot -> left),TreeDepth(pRoot -> right))+1:0;
}
};
值得注意的是,调用了系统提供的max函数,也是额外增加了开销,去掉吧! 为了简洁,就得增加开销有舍必有得!
class Solution {
public:
int TreeDepth(TreeNode* pRoot)
{
if(pRoot == NULL)
return 0;
int left = TreeDepth(pRoot -> left);
int right = TreeDepth(pRoot -> right);
return left > right ? left + 1 : right + 1;
}
};
递归的代码虽然简洁,但也不是万能的;本人倾向于熟练掌握迭代后再去使用递归。