1.二叉树四种遍历
根在前
根在中
根在后
已知前序遍历序列和后序遍历序列,是不能确定一棵二叉树的
#include <iostream>
#include <queue>
using namespace std;
struct TNode{
int id;
char data;
int l,r;
};
TNode tree[10];
void Pre(TNode t){
cout<<t.data<<" ";
if (t.l!=-1)
Pre(tree[t.l]);
if(t.r!=-1)
Pre(tree[t.r]);
}
void In(TNode t){
if (t.l!=-1)
In(tree[t.l]);
cout<<t.data<<" ";
if(t.r!=-1)
In(tree[t.r]);
}
void Back(TNode t){
if (t.l!=-1)
Back(tree[t.l]);
if (t.r!=-1)
Back(tree[t.r]);
cout<<t.data<<" ";
}
void BFS(TNode t){
queue<int> q;
q.push(t.id);
bool vis[10]{};
while (!q.empty()){
int now=q.front(); q.pop();
cout<<tree[now].data;
if (tree[now].l!=-1&&!vis[tree[now].l]){
vis[tree[now].l]= true;
q.push(tree[now].l);
}
if (tree[now].r!=-1&&!vis[tree[now].r]){
vis[tree[now].r]=true;
q.push(tree[now].r);
}
}
}
int main() {
for (int i = 0; i < 10; ++i) {
tree[i].id=i;
tree[i].l=tree[i].r=-1;
}
tree[0].data='A';
tree[1].data='B';
tree[2].data='D';
tree[3].data='C';
tree[4].data='E';
tree[5].data='F';
tree[0].l=1; tree[0].r=2;
tree[1].l=4;
tree[2].l=3;
tree[4].r=5;
In(tree[0]); //In处可换为Pre,Back来调用不同的遍历函数,tree[0]为给函数一个根
return 0;
}
2.树的直径
算法思想:
①从任意一点P出发,通过DFS(BFS)寻找离它最远的点Q。
②再次从点Q出发,通过DFS(BFS)寻找离它最远的W。
③直径即为WQ。
摘自acmPPT<树的直径>