广义树
这种题一般给出每个结点的子结点,如果字段比较多可以使用结构体,然后使用一个指针向量来存储每个结点的子结点,当然还可以根据需要建立父结点的指针字段。广义树常用BSF层次遍历,可以视为是一种特殊结构的BFS题目(一般的BFS题结点不一定是树状结构)。
常用结构体模板
struct Node{
// 其他字段
vector<Node*> children;// 子结点
}
常用层次遍历模板
queue<Node*> q;
q.push(nodes);
Node* cur;
while (!q.empty()) {
for(int i = 0, l = (int)q.size(); i < l; i++){
for(auto lt : cur->children){
q.push(lt);
}
q.pop();
}
}
这个其实就是搜索那一章使用的一次取出一层的层次遍历方法,如果可能一个子结点存在多个父结点的话,还需要使用marked来防止重复入队。
供应商问题
A1079 Total Sales of Supply Chain
A1090 Highest Price in Supply Chain
A1106 Lowest Price in Supply Chain
这三题都差不多,套上面那个模板就可以了
A1094 The Largest Generation
A1094 The Largest Generation
水题,就是考BFS。
A1130 Infix Expression
A1130 Infix Expression
水题,考DFS遍历。
二叉树
要考虑什么时候需要建树,什么时候不需要建树。使用静态写法还是结构体写法。
如果题目直接给出每个结点的左右子结点,那么使用静态写法比较方便,否则使用结构体写法递归建树。要熟练掌握四种遍历顺序的概念和递归输出的方法。
要注意是否会出现重复结点值,如有的话可能插在等于它的结点的右子结点也可能不插入,视具体题目而定。
注意逆后序不是前序。
建树模板
void insert(Node*&x, int value){
if(x == NULL){
x = new Node;
x->value = value;
}else if(value < x->value){
insert(x->left, value);
}else{
insert(x->right, value);
}
}
也可以不使用引用指针,而是使用return来返回根结点,其实差不多。
路径模板
// 递归检查
void