求解最二叉树的最大深度
知识点
对于树的操作:深度优先搜索:DFS,宽度优先搜素:BFS;树的很多问题都是有这两种方法即可解决;
队列和栈的算法;
解题思路
解法一:递归法
递归思想:树的深度,此时可以直接结束递归函数,并返回空节点的深度为 0。
在递归算法中,递归函数的设计非常重要,首先我们要先明确该函数的作用,然后再确定何时结束与何时调用该函数。
**明确函数作用
该函数的作用用一句话概括就是:计算节点的最大深度。
函数输入:确定的节点
函数输出:该节点的最大深度
何时结束
当输入的节点为空节点时,我们无需继续计算其子树的深度,此时可以直接结束递归函数,并返回空节点的深度为 0。
何时调用
当输入节点为非空节点时,该节点的深度取决于其左右子树的深度,即:
maxDepth(root) = max(maxDepth(root.left), maxDepth(root.right)) + 1
此时需要进行函数的递归调用。
** 但是递归函数占用大量的参数栈占空间,99%的递归算法可以转化为用栈的非递归算法**
class Solution {
public:
int maxDepth(TreeNode* root) { // think of it in a precious way
if(root==NULL){
return 0;
}
int ans;
if(root!=NULL){
ans= maxDepth2(root->left,root->right);
}
return ans;
}
// we can define another pvivate function
// left tree and rigtht tree
private:
int maxDepth2(TreeNode* pl,TreeNode* pr){
static int count=1; // define count;
if(pl==NULL && pr!=NULL){
count++;
maxDepth2(pr->left,pr->right);
}
if(pl!=NULL && pr==NULL){
count++;
maxDepth2(pl->left,pl->right);
}
if(pl!=NULL && pr!=NULL){
count++;
count=max(maxDepth2(pl->left,pl->right) ,maxDepth2(pr->left,pr->right));
}
return count;
}
};
// 结果是错的,我也不知道错在什么地方了;
小结
热爱你正在做的事情——编程。这份工作高薪,并且极具成就感;获得成就感的前提是,努力提高自己的技术,真正做出点东西来。不断花时间练习才能得到正反馈,形成良性循环;