一、 递归的方法
思路:
我们可以从另一个角度来理解树的深度:
如果一棵树只有一个结点,那么它的深度为1;
如果根结点只有左子树没有右子树,那么树的深度是左子树的深度加1,加1是加上根节这一层。
如果既有左子树又有右子树,那么树的深度应该是左、右子树中深度较大的值再加1
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个元素出队列),并将下一层如队列。
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; }