今天主要复习了一下有关于二叉树的基础知识,自己遗忘的部分主要是:
1.叶节点是度为0的点(并不是最底下一层)
2.二叉树不是树的特例,二叉树就是一种已经被定义了的树
3.对树遍历代码
vector<int> v;
vector<int> preorderTraversal(TreeNode* root) {
if(root==nullptr) return v;
v.emplace_back(root->val);
preorderTraversal(root->left);
preorderTraversal(root->right);
return v;
}
中序后序同理交换位置即可
今天还看了dfs和bfs对于图的简单遍历,也复习了一下dfs和bfs但是感觉掌握的还是不好。
对于图而言目前接触到的,就只用将图内容转化到二维数组中解决即可。
1.dfs对于图的遍历
void dfs(int cur) //cur代表当前位置的编号
{
int i,j,k=0,n;
k++;
if(k==n)return ;
for(i=1;i<=n;i++)
{
if(e[cur][i]==1&&book[i]==0)
{
book[i]=1;
dfs(i);;
}
}
}
2.bfs对于图的遍历(此题中就相当于吧各个数值放在队列中进行操作)
int head=1,tail=1;
que[tail]=1;
tail++;book[1]=1;
while(head<tail&&tail<=n)
{
int cur=que[head];
for(i=1;i<=n;i++)
{
if(e[cur][i]==1&&book[i]==0)
{
que[tail]=i;tail++;book[i]=1;
}
if(tail>n){break;}
}
head++;
}
还复习了一下昨天的题,对于树而言也可以dfs 来进行
pat 1004
#include<iostream>
#include<vector>
using namespace std;
int n,m,maxlevel,eachlevel[100]={0};
vector<int>child[100];
void dfs(int curid,int curlevel)
{
if(curlevel>maxlevel){maxlevel=curlevel;}
if(child[curid].size()>0){
for(auto x:child[curid])
{
dfs(x,curlevel+1);
}
}
else{eachlevel[curlevel]++;}
}
int main()
{
int i,j,k;
cin>>n>>m;
for(i=0;i<m;i++)
{
int id,k;
cin>>id>>k;
while(k--)
{
cin>>j;
child[id].push_back(j);
}
}
dfs(1,1);
for(i=1;i<=maxlevel;i++)
{
if(i>1){cout<<' ';}
cout<<eachlevel[i];
}
}
用dfs写了几种类型的题了,但是还是感觉对其本质内容还是不清晰啊,什么类型的题能用,该怎么用,还是不够了解,可能还是题目写少了,还是得任重道远啊。