Merge pull request #887 from KingArthur0205/remote

添加 1002.查找常用字符.md C语言版本, 0110.平衡二叉树.md C语言递归法&迭代法
This commit is contained in:
程序员Carl
2021-11-08 14:46:15 +08:00
committed by GitHub
2 changed files with 155 additions and 0 deletions

View File

@ -635,6 +635,108 @@ var isBalanced = function(root) {
}; };
``` ```
## C
递归法:
```c
int getDepth(struct TreeNode* node) {
//如果结点不存在返回0
if(!node)
return 0;
//求出右子树深度
int rightDepth = getDepth(node->right);
//求出左子树深度
int leftDepth = getDepth(node->left);
//返回左右子树中的较大值+1
return rightDepth > leftDepth ? rightDepth + 1 : leftDepth + 1;
}
bool isBalanced(struct TreeNode* root) {
//递归结束条件为传入结点为NULL返回True
if(!root)
return 1;
//求出左右子树的深度
int leftDepth = getDepth(root->left);
int rightDepth = getDepth(root->right);
int diff;
//若左右子树绝对值差距大于1返回False
if((diff = leftDepth - rightDepth) > 1 || diff < -1)
return 0;
//检查左右子树是否为平衡二叉树
return isBalanced(root->right) && isBalanced(root->left);
}
```
迭代法:
```c
//计算结点深度
int getDepth(struct TreeNode* node) {
//开辟栈空间
struct TreeNode** stack = (struct TreeNode**)malloc(sizeof(struct TreeNode*) * 10000);
int stackTop = 0;
//若传入结点存在将其入栈。若不存在函数直接返回0
if(node)
stack[stackTop++] = node;
int result = 0;
int depth = 0;
//当栈中有元素时,进行迭代遍历
while(stackTop) {
//取出栈顶元素
struct TreeNode* tempNode = stack[--stackTop];
//若栈顶元素非NULL则将深度+1
if(tempNode) {
depth++;
//将栈顶元素再次入栈添加NULL表示此结点已被遍历
stack[stackTop++] = tempNode;
stack[stackTop++] = NULL;
//若栈顶元素有左右孩子,则将孩子结点入栈
if(tempNode->left)
stack[stackTop++] = tempNode->left;
if(tempNode->right)
stack[stackTop++] = tempNode->right;
//更新结果
result = result > depth ? result : depth;
}
else {
//若为NULL则代表当前结点已被遍历深度-1
tempNode = stack[--stackTop];
depth--;
}
}
return result;
}
bool isBalanced(struct TreeNode* root){
//开辟栈空间
struct TreeNode** stack = (struct TreeNode**)malloc(sizeof(struct TreeNode*) * 10000);
int stackTop = 0;
//若根节点不存在返回True
if(!root)
return 1;
//将根节点入栈
stack[stackTop++] = root;
//当栈中有元素时,进行遍历
while(stackTop) {
//将栈顶元素出栈
struct TreeNode* node = stack[--stackTop];
//计算左右子树的深度
int diff = getDepth(node->right) - getDepth(node->left);
//若深度的绝对值大于1返回False
if(diff > 1 || diff < -1)
return 0;
//如果栈顶结点有左右结点,将左右结点入栈
if(node->left)
stack[stackTop++] = node->left;
if(node->right)
stack[stackTop++] = node->right;
}
//若二叉树遍历结束后没有返回False则返回True
return 1;
}
```
----------------------- -----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)

View File

@ -331,6 +331,59 @@ func commonChars(_ words: [String]) -> [String] {
} }
``` ```
C:
```c
//若两个哈希表定义为char数组每个单词的最大长度不会超过100因此可以用char表示可以提高时间和空间效率
void updateHashTable(int* hashTableOne, int* hashTableTwo) {
int i;
for(i = 0; i < 26; i++) {
hashTableOne[i] = hashTableOne[i] < hashTableTwo[i] ? hashTableOne[i] : hashTableTwo[i];
}
}
char ** commonChars(char ** words, int wordsSize, int* returnSize){
//用来统计所有字母出现的最小频率
int hashTable[26] = { 0 };
//初始化返回的char**数组以及返回数组长度
*returnSize = 0;
char** ret = (char**)malloc(sizeof(char*) * 100);
//如果输入数组长度为0则返回NULL
if(!wordsSize)
return NULL;
int i;
//更新第一个单词的字母频率
for(i = 0; i < strlen(words[0]); i++)
hashTable[words[0][i] - 'a']++;
//更新从第二个单词开始的字母频率
for(i = 1; i < wordsSize; i++) {
//创建新的哈希表,记录新的单词的字母频率
int newHashTable[26] = { 0 };
int j;
for(j = 0; j < strlen(words[i]); j++) {
newHashTable[words[i][j] - 'a']++;
}
//更新原哈希表
updateHashTable(hashTable, newHashTable);
}
//将哈希表中的字符变为字符串放入ret中
for(i = 0; i < 26; i++) {
if(hashTable[i]) {
int j;
for(j = 0; j < hashTable[i]; j++) {
char* tempString = (char*)malloc(sizeof(char) * 2);
tempString[0] = i + 'a';
tempString[1] = '\0';
ret[(*returnSize)++] = tempString;
}
}
}
return ret;
}
```
----------------------- -----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
* B站视频[代码随想录](https://space.bilibili.com/525438321) * B站视频[代码随想录](https://space.bilibili.com/525438321)