第十六天的这三道题其实样子很一样。
不论是层序遍历抑或是递归的方法。
层序呢,就是一层一层的往里面叠加,但是叠加的方法可能稍有不同。
求二叉树的最大深度时,
第一层while下放depth++, 最终就可以得到最大深度。
求二叉树的最小深度时,
一定要注意:最小的深度的定义: 从根节点到叶子结点,并且这个叶子结点是一个没有子节点的节点。所以依旧是depth++; 但是一旦出现了某个 cur->left == null && cur-.right == NULL 此时就可以返回了
求完全二叉树的节点个数:
这个呢其实很简单,就是在第二层不断count++;就可以了。
int getNodes(struct TreeNode* root) {
if (root == NULL) return 0;
int leftNodes = getNodes(root->left);
int rightNodes = getNodes(root->right);
return 1 + leftNodes + rightNodes;
}
int countNodes(struct TreeNode* root) {
if (root == NULL) return 0;
return getNodes(root);
}
int countNodes(struct TreeNode* root){
if (root == NULL) return 0;
struct TreeNode* queueData[50001];
struct TreeNode* cur;
int queueRear = 0, queueFront = 0;
queueData[queueRear++] = root;
int count = 0;
while(queueRear != queueFront) {
int last = queueRear;
while (last != queueFront) {
cur = queueData[queueFront++];
count++;
if (cur->left != NULL) {
queueData[queueRear++] = cur->left;
}
if (cur->right != NULL) {
queueData[queueRear++] = cur->right;
}
}
}
return count;
}
递归:一定要清楚递归的三部曲,1.确定函数的参数和返回值2. 确定终止条件(这个就是root == null) 3. 确定单层递归的逻辑。
三个题其实代码几乎一样,就是在子函数中返回什么东西需要注意
这里要最小深度的特殊之处,返回值一定要是某个节点没有子节点 。 否则那就返回另一节点的 1+ 高度
int minDepth(struct TreeNode* root) {
if (root == NULL) return 0;
int leftDepth = minDepth(root->left);
int rightDepth = minDepth(root->right);
if (root->left == NULL && root->right != NULL) {
return 1 + rightDepth;
}
else if (root->left != NULL && root->right == NULL) {
return 1 + leftDepth;
}
int result = 1 + fmin(leftDepth, rightDepth);
return result;
}