这是我在假期学习的第二次总结,也是我这两天的学习总结。
这两天我学习了上周的dfs算法以及二叉树的一些基本概念。
先说说dfs算法吧!
我看了这么一道题目:输入一个N,输出在1至N中数字选择的数字。
举个例子:N=2
输出:
12
1
2
上面的一个空也是输出。
这是一个简单的例子,但是很好的反映出了dfs的一个思想和原理。同时也更好反映出了在上一次的总结中所提出的观点。以下是代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=20;
int n;
int st[N];
void dfs(int x)
{
if(x>n)
{
for(int i=1; i<=n; i++)
{
if(st[i]==1)
{
printf("%d",i);
}
}
printf("\n");
return ;
}
st[x]=1;
dfs(x+1);
st[x]=0;
st[x]=2;
dfs(x+1);
st[x]=0;
}
int main()
{
scanf("%d",&n);
dfs(1);
return 0;
}
可以很明显的看见,是使用了递归的方法。在代码中,程序是一步一步的去分析。比如说,我输入2,那么在算法中就会分析是输出1还是不输出,之后再分析2。并且第一次分析的两种情况是同时进行的
在选1和在选2的过程中都是同时进行的。当然,当数据过大的时候int是不够的,其数据大小可用2^N来计算。
而在今天学习二叉树的时候,也就可以发现,以上的图是一个“树”。
就像它一样,根据它我们也能够很简单地看出一些二叉树的特性。它像一棵倒着的树,由根不断地分支。知识点就不过多的赘述。
说一下它的特点:
1、根节点是没有父节点的。如上图中的1号。
2、满二叉树的节点数是2^h-1个,h是深度。
3、所有的父节点都要比子节点小。
挂一个一目了然的图
明天则深入的了解一些有关堆的算法方面的知识,选择性的去做一些题目。