深度优先搜索和广度优先搜索
程序员文章站
2022-05-22 20:22:36
...
深度优先搜索(DFS)和广度优先搜索(BFS)
这两种算法思想在数据结构内都是解决图论相关的知识。也能提供一些对问题解决的思路。
BFS
BFS如其命名一样,是需要将一个层次的问题解决完毕之后才会去解决下一层次的问题。
- 较为经典的是二叉树的层次遍历。:思想需要借助队列,先将根节点推入队列中,队列有一个元素了,循环队列,队不空,执行出队,并将该节点的左右孩子依次入队,以此类推。
typedef struct queue{
struct TreeNode *data[1009];
int head;
int tail;
}QUEUE,*PQUEUE;
int *levelOrder(struct TreeNode *root, int *returnSize)
{
//判断树是否为空
if (!root)
{
*returnSize = 0;
return NULL;
}
//将根节点入队
QUEUE q;
q.head = 0;
q.tail = 1;
q.data[0] = root;
int count = -1;
int *result = (int *)malloc(sizeof(int)*1009);
while (q.head != q.tail)
{
if (q.data[q.head]->left)
{
q.data[q.tail++] = q.data[q.head]->left;
}
if (q.data[q.head]->right)
{
q.data[q.tail++] = q.data[q.head]->right;
}
//出队
count++;
result=(int *)realloc(result, sizeof(int) * (count + 1));
result[count] = q.data[q.head]->val;
q.head++;
}
*returnSize = count + 1;
return result;
}
DFS
DFS算法思想:类似于二叉树的先序遍历,沿某条直线透入,到底部,然后逐步返回。
- 二叉树的先序遍历是方式是先访问根节点,在沿着做孩子往下递,遇到NULL就返回,在访问右孩子
int* preorderTraversal(struct TreeNode* root, int* returnSize){
int* res = malloc(sizeof(int) * 2000);
*returnSize = 0;
preorder(root, res, returnSize);
return res;
}
void preorder(struct TreeNode* root,int* res,int* returnSize){
if(root==NULL){
return;
}
res[(*returnSize)++]=root->val;
preorder(root->left,res,returnSize);
preorder(root->right,res,returnSize);
}
上一篇: 深度优先搜索和广度优先搜索
下一篇: Gradle打jar包,包含所有依赖