一、简介
1、树(tree)的性质
- 联通且无环的无向图
- 有n个点,n-1条边
- 路上任意两点之间的路径唯一
- 无环的无向图称为森林(forest)
2、有根树(rooted tree)
在树上指定一个点r为根(root)就得到了有根树。
在有根树里,没有子节点的点被称为叶子。
3、树的直径(diameter)
路上的一条最长的路径(边最多)称为树的直径。
4. 满二叉树
每个非子结点都有
二、前、中、后序遍历
- 前/中/后序遍历都是递归的
1. 前序遍历(preorder tree walk)
(1)顺序:
根->左->右
(2)函数伪代码:
preorder(u)
{
visit u;
preorder(u的左孩子);
preorder(u的右孩子);
}
2. 中序遍历(inorder tree walk)
(1)顺序:
左->根->右
(2)伪代码:
inoder(u)
{
inorder(u的左孩子);
visit u;
inorder(u的右孩子);
}
3. 后序遍历(postorder tree walk)
(1)顺序:
左->右->根
(2)伪代码:
postorder(u)
{
postorder(u的左孩子);
postorder(u的右孩子);
visit u;
}
4. 已知前序遍历和中序遍历,求后序遍历
(1)例题
前序遍历:a b d f c e g
中序遍历:d f b a c g e
求后序遍历
(2)解题方法
- 确定根节点;
- 在中序遍历中确定根的左右子树的范围;
- 递归处理左右子树。
三、在树上DFS
在树上dfs不需要vis数组。
vector<int> g[1005];
void dfs(int u, int p)//u为当前需要搜索的点,p为u的父节点;如果u没有根节点,则p为-1。
{
for(int v : g[a]) //遍历所有点
{
if(v != p)//如果这个点不是自己,可以走
{
dfs(v, u);//在下一个点继续搜索
}
}
}