Merge branch 'master' of github.com:youngyangyang04/leetcode-master

This commit is contained in:
youngyangyang04
2021-11-21 16:20:18 +08:00
19 changed files with 501 additions and 9 deletions

View File

@@ -447,7 +447,80 @@ var countNodes = function(root) {
};
```
## C:
递归法
```c
int countNodes(struct TreeNode* root) {
//若传入结点不存在返回0
if(!root)
return 0;
//算出左右子树的结点总数
int leftCount = countNodes(root->left);
int rightCount = countNodes(root->right);
//返回左右子树结点总数+1
return leftCount + rightCount + 1;
}
int countNodes(struct TreeNode* root){
return getNodes(root);
}
```
迭代法
```c
int countNodes(struct TreeNode* root){
//记录结点总数
int totalNum = 0;
//开辟栈空间
struct TreeNode** stack = (struct TreeNode**)malloc(sizeof(struct TreeNode*) * 100);
int stackTop = 0;
//如果root结点不为NULL则将其入栈。若为NULL则不会进入遍历返回0
if(root)
stack[stackTop++] = root;
//若栈中有结点存在,则进行遍历
while(stackTop) {
//取出栈顶元素
struct TreeNode* tempNode = stack[--stackTop];
//结点总数+1
totalNum++;
//若栈顶结点有左右孩子,将它们入栈
if(tempNode->left)
stack[stackTop++] = tempNode->left;
if(tempNode->right)
stack[stackTop++] = tempNode->right;
}
return totalNum;
}
```
满二叉树
```c
int countNodes(struct TreeNode* root){
if(!root)
return 0;
int leftHeight = 0;
int rightHeight = 0;
struct TreeNode* rightNode = root->right;
struct TreeNode* leftNode = root->left;
//求出左子树深度
while(leftNode) {
leftNode = leftNode->left;
leftHeight++;
}
//求出右子树深度
while(rightNode) {
rightNode = rightNode->right;
rightHeight++;
}
//若左右子树深度相同为满二叉树。结点个数为2^height-1
if(rightHeight == leftHeight) {
return (2 << leftHeight) - 1;
}
//否则返回左右子树的结点个数+1
return countNodes(root->right) + countNodes(root->left) + 1;
}
```
-----------------------
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>