一、 遞歸的方法
思路:
我們可以從另一個角度來理解樹的深度:
如果一棵樹只有一個結點,那么它的深度為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; }