题目描述
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
解法及思路
一、 递归的方法
思路:
我们可以从另一个角度来理解树的深度:
-
如果一棵树只有一个结点,那么它的深度为1;
-
如果根结点只有左子树没有右子树,那么树的深度是左子树的深度加1,加1是加上根节点这一层
-
如果既有左子树又有右子树,那么树的深度应该是左、右子树中深度较大的值再加1
code 如下:
struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; class Solution { public: int TreeDepth(TreeNode* pRoot) { if(pRoot==NULL) return 0; int nleft = TreeDepth(pRoot->left); int nright = TreeDepth(pRoot->right); return (nleft>nright)?(nleft+1):(nright+1); } };
二、非递归方法
思路
采用层次遍历的方法,类似bfs的解法
-
每遍历一层,depth++;
-
每一层,需使用一个变量
len
记录该层的结点个数,也就是队列的当前长度,然后依次在队列中访问该层的len
个结点(将队列中len
个元素出队列),并将下一层如队列。
code如下:
int TreeDepth(TreeNode* pRoot) { queue<TreeNode*> q; if(!pRoot) return 0; q.push(pRoot); int level=0; while(!q.empty()){ int len=q.size(); level++; while(len--){ TreeNode* tem=q.front(); q.pop(); if(tem->left) q.push(tem->left); if(tem->right) q.push(tem->right); } } return level; }
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/15246.html