最大的敌人其实是自己
最近报了极客时间的21天打卡,今天是第七天周日,感觉周六的时候是最难坚持的,因为自己想要利用这个打卡复习一下算法训练营的内容,虽然参加了,并且最后毕业了,但是自己还是感觉对常用的算法和数据结构一知半解,一知半解的评价都有点高,应该是不怎么解,所以要复习和巩固一下
从递归开始,递归的最主要的思想就是:
- 找重复性,抵制人肉递归的诱惑
- 找到最近最简方法,将其拆解成可重复解决的问题(重复子问题)
- 数学归纳法思维
然后到树了,二叉树的前序、中序、后序遍历,其中需要使用到栈和队列,尤其是队列看了代码是没有理解的,也不是说没有理解使用队列遍历二叉树,应该是没有理解队列的实现和使用,因为在使用c写算法和数据结构,所以一直没有get到队列的精髓(从这里可以看出自己的基础是比较弱的,所以需要多多练习,多多实践)
自己需要使用队列的时候还是感觉到比较难的,其中有想要放弃的时候,可是放弃的话,下次你遇见到它的时候还是不会,还是不知道怎么写,所以咬下牙,克服掉它,下次就会好很多了。还要你一定要知道自己要什么,你才可能到你想要的地方。对于程序也是如此,你一定要明白和理解你要实现到什么效果,然后去分析、拆解、调试、获得反馈、优化,才可能写出你自己想要的代码。
为什么说人最大的敌人是自己呢?
在遇到困难或者不会的知识点的时候,心里面有两个你,一个你说:这个放一放把,后面遇到慢慢就会学会的,一个你说:这个你放了,后面你还是不会的,不如当下把它解决掉,学会,当然现实中大多数是后者,当然如果你超出你当前的知识水平学习特别难的东西的时候建议你选前者,如果这个问题你跳一下可以碰到的话,一定要选择后者,把它当前解决掉,fix掉。这个后面其实就是人性的懒惰。
还有不要贪心,遇到的好的东西,既想要A还想要B,你要知道自己没有那么多时间和精力都想要的,把自己最好的时间和精力留给最重要的人和事!
代码如下:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
}TreeNode;
typedef struct {
struct TreeNode* data[MAXSIZE];
int front;
int rear;
}SqQueue;
struct TreeNode* initTree() {
struct TreeNode *root;
int data;
scanf("%d",&data);
if (data == 0) {
root = NULL;
return root;
}else {
root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
if (!root) {
return NULL;
}
root->val = data;
printf("输入%d的左节点", data);
root->left = initTree();
printf("输入%d的右节点", data);
root->right = initTree();
}
return root;
}
int EnQueue(SqQueue *Q,struct TreeNode *root) {
if ((Q->rear+1)%MAXSIZE == Q->front) {
return ERROR;
}
Q->data[Q->rear] = root;
Q->rear = (Q->rear+1) % MAXSIZE;
return OK;
}
int InitQueue(SqQueue *Q) {
Q->front = 0;
Q->rear = 0;
return 1;
}
struct TreeNode* DeQueue(SqQueue *Q) {
struct TreeNode *root;
if (Q->front == Q->rear) {
return ERROR;
}
root = Q->data[Q->front];
Q->front = (Q->front+1) % MAXSIZE;
return root;
}
void queueTraversal(struct TreeNode *root) {
// 利用队列实现层序遍历
if (!root) {
return;
}
// 创建队列
SqQueue q;
InitQueue(&q);
EnQueue(&q,root);
int i = 0;
printf("层序遍历是
");
while (q.front != q.rear) {
root = DeQueue(&q);
printf("%d ",root->val);
if (root->left)
EnQueue(&q,root->left);
if (root->right)
EnQueue(&q,root->right);
}
printf("
");
}
void stackTraversal(struct TreeNode *root) {
struct TreeNode* stack[100];
int top = -1;
printf("非递归中序比那里如下:
");
while (root || top != -1) {
while (root) {
// 把所有左树入栈
top++;
stack[top] = root;
root = root->left;
}
if (top != -1) {
root = stack[top];
top--;
printf("%d ",root->val); // 输出节点数据
root=root->right;
}
}
printf("
");
}
int main() {
// 开辟头节点
struct TreeNode* tree;
// 将头节点指针传入函数参数为节点指针的参数
tree = initTree();
// 然后根据条件输入创建二叉树
// 使用队列层序遍历二叉树
queueTraversal(tree);
// 使用栈深度遍历二叉树
stackTraversal(tree);
printf("Hello world
");
return 0;
}
参考文章:
C语言实现二叉树(创建,先序,中序,后序遍历的递归实现,以及非递归的中序遍历(栈),求树的高度)http://www.manongzj.com/blog/3-mcmgrgfddalajnn.html
二叉树利用队列实现层次遍历 https://blog.csdn.net/lafengxiaoyu/article/details/53240346