题目:
Given a binary tree, find its maximum depth.
The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.
Note: A leaf is a node with no children.
Example:
Given binary tree [3,9,20,null,null,15,7],
3/ \9 20/ \15 7
return its depth = 3.
解法一:深度优先遍历DFS
每递归一次加1
代码如下:
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int maxDepth(TreeNode* root) {if(root == NULL)return 0;return 1 + max(maxDepth(root->left),maxDepth(root->right));}
};
解法二:广度优先BFS
代码如下:
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int maxDepth(TreeNode* root) {if(root == NULL)return 0;queue<TreeNode*> Q;Q.push(root);int res = 0;while(!Q.empty()){int len = Q.size();res++;for(int i = 0; i < len; i++){TreeNode* p = Q.front();Q.pop();if(p->left)Q.push(p->left);if(p->right)Q.push(p->right);}}return res;}
};
方法三:迭代DFS
使用栈分别存储节点和深度,节点和深度同时出栈,表示当前节点的深度,然后随着节点的加深,深度增加,最后求出最大深度
代码如下:
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int maxDepth(TreeNode* root) {if(root == NULL)return 0;stack<TreeNode*> stk;stack<int> depStk;int depth = 1;int max = 0;while(root != NULL || !stk.empty()){while(root){stk.push(root);depStk.push(depth);root = root->left;depth++;}root = stk.top();depth = depStk.top();stk.pop();depStk.pop();if(max < depth)max = depth;root = root->right;depth++; }return max;}
};