104.二叉树的最大深度
思路:这道题最开始的时候,我想的是用前序遍历的思路来做,整个过程有剪枝的过程,弄了半天没写出来,主要是剪枝没写对!最大深度是叶子节点的高度,可以使用后序遍历来做。
class Solution {
public:int getdepth(TreeNode* node){if(node==nullptr)return 0;int leftdepth=getdepth(node->left);int rightdepth=getdepth(node->right);return 1+max(leftdepth,rightdepth);}int maxDepth(TreeNode* root) {return getdepth(root);}
};
手动模拟一下这个递归过程:对递归理解更加透彻!
从这个思路可以看出,从根节点开始,分为左,右两个子树,每次遍历完两个子树,返回两个子树其中深度更深的,再进行加1,这里为什么要加1呢,因为在leetcode中,其将深度定义为从根节点到某个节点经历过的节点数,故比起某些定义为根节点到某个节点经历过的边数要多加1。
前序遍历:
class Solution {
public:int result=0;void getdepth(TreeNode* node,int depth){result=result>depth?result:depth;if(node->left==nullptr&&node->right==nullptr){return;}if(node->left){depth++;getdepth(node->left,depth);depth--;}if(node->right){depth++;getdepth(node->right,depth);depth--;}}int maxDepth(TreeNode* root) {if(root==nullptr)return 0;getdepth(root,1);return result;}
};
111.二叉树的最小深度
递归法:
思路:注意要单独处理一个节点左子节点为空,而右子节点不为空,和一个节点左子节点不为空,而右子节点不为空的情况。因为你是返回的
leftdepth
和rightdepth
的最小值,如果不处理,那必定受到影响。
class Solution {
public:int getdepth(TreeNode* node){if(node==nullptr)return 0;int leftdepth=getdepth(node->left);int rightdepth=getdepth(node->right);if(node->left==nullptr&&node->right!=nullptr){return 1+rightdepth;}if(node->left!=nullptr&&node->right==nullptr){return 1+leftdepth;}return 1+min(leftdepth,rightdepth);}int minDepth(TreeNode* root) {return getdepth(root);}
};
class Solution {
public:int result=INT_MAX;void getdepth(TreeNode* node,int depth){if(node->left==nullptr&&node->right==nullptr){result=result>depth?depth:result;return;}if(node->left){depth++;getdepth(node->left,depth);depth--;}if(node->right){depth++;getdepth(node->right,depth);depth--;}}int minDepth(TreeNode* root) {if(root==nullptr)return 0;getdepth(root,1);return result;}
};
222.完全二叉树的节点个数
class Solution {
public:int result=0;void getnodes(TreeNode* root){result++;if(root->left==nullptr&&root->right==nullptr){return;}if(root->left){getnodes(root->left);}if(root->right){getnodes(root->right);}}int countNodes(TreeNode* root) {if(root==nullptr)return 0;getnodes(root);return result;}
};
class Solution {
public:int getnode(TreeNode* node){if(node==nullptr)return 0;int leftnumber=getnode(node->left);int rightnumber=getnode(node->right);return 1+leftnumber+rightnumber;}int countNodes(TreeNode* root) {return getnode(root);}
};