递归法思路:求最大深度,应该是前序遍历,但是最大深度也可以是高度,因此用后序遍历也可以
int maxDepth(TreeNode* root){ if(root==NULL) return 0; return getDepth(root); } int getDepth(TreeNode* cur){ if(cur==NULL) return 0; int leftdepth=getDepth(cur->left); int rightdepth=getDepth(cur->right); return max(leftdepth,rightdepth)+1; }迭代法思路:层序遍历最适合,因为遍历的次数就是层数就是最大深度
int maxDepth(TreeNode* root) {//层序遍历 queue<TreeNode*> que; int depth=0; if(root!=NULL) que.push(root); while(!que.empty()){ int size=que.size(); depth++; for(int i=0;i<size;i++){ TreeNode* cur=que.front(); que.pop(); if(cur->left) que.push(cur->left); if(cur->right) que.push(cur->right); } } return depth; }迭代思路:比较好想的是用层序遍历来遍历结点,判断每一个结点是不是叶结点,如果是叶结点,那么就结束遍历,当前层数就是最小深度
int minDepth(TreeNode* root) { int depth=0; queue<TreeNode*> que; if(root!=NULL) que.push(root); while(!que.empty()){ int size=que.size(); depth++; for(int i=0;i<size;i++){ TreeNode* cur=que.front(); que.pop(); if(cur->left) que.push(cur->left); if(cur->right) que.push(cur->right); if(cur->left==NULL&&cur->right==NULL) return depth; } } return depth; }递归思路:和求最大深度的思路相似,但是需要注意的地方在于,当根结点的左结点或者右结点为空的时候,min()为0,但其实最小深度不为0,而是另外一个子树的最小深度。 错误:
int minDepth(TreeNode* root) { } int getDepth(TreeNode* cur){ if(cur==NULL) return 0; int left=getDepth(cur->left); int right=grtDepth(cur->right); return min(left,right)+1; }正确:
int minDepth(TreeNode* root) { return getDepth(root); } int getDepth(TreeNode* cur){ if(cur==NULL) return 0; if(cur->left==NULL&&cur->right!=NULL) return 1+getDepth(cut->right); if(cur->right==NULL&&cur->left!=NULL) return 1+getDepth(cut->left); int left=getDepth(cur->left); int right=grtDepth(cur->right); return min(left,right)+1; }递归思路:左边结点个数加上右边结点个数
class Solution1 {//递归 public: int countNodes(TreeNode* root) { return getNodeNum(root); } int getNodeNum(TreeNode* root){ if(root==NULL) return 0; int leftNum=getNodeNum(root->left); int rightNum=getNodeNum(root->right); return leftNum+rightNum+1; } };迭代思路;层序遍历统计每层个数
class Solution {//迭代 public: int countNodes(TreeNode* root) { int num=0; queue<TreeNode*> que; if(root!=NULL) que.push(root); while(!que.empty()){ int size=que.size(); num+=size; for(int i=0;i<size;i++){ TreeNode* cur=que.front(); que.pop(); if(cur->left) que.push(cur->left); if(cur->right) que.push(cur->right); } } return num; } };递归思路:比较每一个结点的高度,显然用后序遍历,比较当前结点的左右子树的最大高度,大于1则不平衡 不容易想到的一点是,如果差大于1就不应返回高度,而是返回一个不可能的值,主函数判断是不是这个值,如果是则就返回false;
bool isBalanced(TreeNode* root) { if(root==NULL) return true; return getdiff(root)==-1?false:true; } int getdiff(TreeNode* cur){ if(cur==NULL) return 0; int left=getdiff(cur->left); if(left==-1){return -1;} int right=getdiff(cur->rigth); if(right==-1){return -1;} //当结点的差不为1时,就不用返回高度了; return abs(left-right)>1?-1:max(left,right)+1; }