mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-09 11:34:46 +08:00
Merge pull request #901 from KingArthur0205/remote
添加 0654.最大二叉树.md C语言版本, 0222.完全二叉树的结点个数.md C语言版本, 添加 0104.二叉树的最大深度.md C语言版本, 以及 添加 1047.删除字符串中的所有相邻重复项.md C语言版本
This commit is contained in:
@ -597,6 +597,61 @@ var maxDepth = function(root) {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## C
|
||||||
|
二叉树最大深度递归
|
||||||
|
```c
|
||||||
|
int maxDepth(struct TreeNode* root){
|
||||||
|
//若传入结点为NULL,返回0
|
||||||
|
if(!root)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
//求出左子树深度
|
||||||
|
int left = maxDepth(root->left);
|
||||||
|
//求出右子树深度
|
||||||
|
int right = maxDepth(root->right);
|
||||||
|
//求出左子树深度和右子树深度的较大值
|
||||||
|
int max = left > right ? left : right;
|
||||||
|
//返回较大值+1(1为当前层数)
|
||||||
|
return max + 1;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
二叉树最大深度迭代
|
||||||
|
```c
|
||||||
|
int maxDepth(struct TreeNode* root){
|
||||||
|
//若传入根节点为NULL,返回0
|
||||||
|
if(!root)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
int depth = 0;
|
||||||
|
//开辟队列空间
|
||||||
|
struct TreeNode** queue = (struct TreeNode**)malloc(sizeof(struct TreeNode*) * 6000);
|
||||||
|
int queueFront = 0;
|
||||||
|
int queueEnd = 0;
|
||||||
|
|
||||||
|
//将根结点入队
|
||||||
|
queue[queueEnd++] = root;
|
||||||
|
|
||||||
|
int queueSize;
|
||||||
|
//求出当前队列中元素个数
|
||||||
|
while(queueSize = queueEnd - queueFront) {
|
||||||
|
int i;
|
||||||
|
//若当前队列中结点有左右子树,则将它们的左右子树入队
|
||||||
|
for(i = 0; i < queueSize; i++) {
|
||||||
|
struct TreeNode* tempNode = queue[queueFront + i];
|
||||||
|
if(tempNode->left)
|
||||||
|
queue[queueEnd++] = tempNode->left;
|
||||||
|
if(tempNode->right)
|
||||||
|
queue[queueEnd++] = tempNode->right;
|
||||||
|
}
|
||||||
|
//更新队头下标
|
||||||
|
queueFront += queueSize;
|
||||||
|
//深度+1
|
||||||
|
depth++;
|
||||||
|
}
|
||||||
|
return depth;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ" target="_blank">
|
<a href="https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ" target="_blank">
|
||||||
|
@ -446,7 +446,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;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
<p align="center">
|
<p align="center">
|
||||||
|
@ -562,7 +562,7 @@ var invertTree = function(root) {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
C:
|
### C:
|
||||||
递归法
|
递归法
|
||||||
```c
|
```c
|
||||||
struct TreeNode* invertTree(struct TreeNode* root){
|
struct TreeNode* invertTree(struct TreeNode* root){
|
||||||
@ -579,6 +579,7 @@ struct TreeNode* invertTree(struct TreeNode* root){
|
|||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
迭代法:深度优先遍历
|
迭代法:深度优先遍历
|
||||||
```c
|
```c
|
||||||
struct TreeNode* invertTree(struct TreeNode* root){
|
struct TreeNode* invertTree(struct TreeNode* root){
|
||||||
|
@ -353,6 +353,35 @@ var constructMaximumBinaryTree = function (nums) {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## C
|
||||||
|
```c
|
||||||
|
struct TreeNode* traversal(int* nums, int left, int right) {
|
||||||
|
//若左边界大于右边界,返回NULL
|
||||||
|
if(left >= right)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
//找出数组中最大数坐标
|
||||||
|
int maxIndex = left;
|
||||||
|
int i;
|
||||||
|
for(i = left + 1; i < right; i++) {
|
||||||
|
if(nums[i] > nums[maxIndex])
|
||||||
|
maxIndex = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
//开辟结点
|
||||||
|
struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
|
||||||
|
//将结点的值设为最大数组数组元素
|
||||||
|
node->val = nums[maxIndex];
|
||||||
|
//递归定义左孩子结点和右孩子结点
|
||||||
|
node->left = traversal(nums, left, maxIndex);
|
||||||
|
node->right = traversal(nums, maxIndex + 1, right);
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct TreeNode* constructMaximumBinaryTree(int* nums, int numsSize){
|
||||||
|
return traversal(nums, 0, numsSize);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
|
@ -266,6 +266,57 @@ var removeDuplicates = function(s) {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
C:
|
||||||
|
方法一:使用栈
|
||||||
|
```c
|
||||||
|
char * removeDuplicates(char * s){
|
||||||
|
//求出字符串长度
|
||||||
|
int strLength = strlen(s);
|
||||||
|
//开辟栈空间。栈空间长度应为字符串长度+1(为了存放字符串结束标志'\0')
|
||||||
|
char* stack = (char*)malloc(sizeof(char) * strLength + 1);
|
||||||
|
int stackTop = 0;
|
||||||
|
|
||||||
|
int index = 0;
|
||||||
|
//遍历整个字符串
|
||||||
|
while(index < strLength) {
|
||||||
|
//取出当前index对应字母,之后index+1
|
||||||
|
char letter = s[index++];
|
||||||
|
//若栈中有元素,且栈顶字母等于当前字母(两字母相邻)。将栈顶元素弹出
|
||||||
|
if(stackTop > 0 && letter == stack[stackTop - 1])
|
||||||
|
stackTop--;
|
||||||
|
//否则将字母入栈
|
||||||
|
else
|
||||||
|
stack[stackTop++] = letter;
|
||||||
|
}
|
||||||
|
//存放字符串结束标志'\0'
|
||||||
|
stack[stackTop] = '\0';
|
||||||
|
//返回栈本身作为字符串
|
||||||
|
return stack;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
方法二:双指针法
|
||||||
|
```c
|
||||||
|
char * removeDuplicates(char * s){
|
||||||
|
//创建快慢指针
|
||||||
|
int fast = 0;
|
||||||
|
int slow = 0;
|
||||||
|
//求出字符串长度
|
||||||
|
int strLength = strlen(s);
|
||||||
|
//遍历字符串
|
||||||
|
while(fast < strLength) {
|
||||||
|
//将当前slow指向字符改为fast指向字符。fast指针+1
|
||||||
|
char letter = s[slow] = s[fast++];
|
||||||
|
//若慢指针大于0,且慢指针指向元素等于字符串中前一位元素,删除慢指针指向当前元素
|
||||||
|
if(slow > 0 && letter == s[slow - 1])
|
||||||
|
slow--;
|
||||||
|
else
|
||||||
|
slow++;
|
||||||
|
}
|
||||||
|
//在字符串结束加入字符串结束标志'\0'
|
||||||
|
s[slow] = 0;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
|
Reference in New Issue
Block a user