C++ 树(从入门到入土)(一)

一、简介

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)解题方法

  1. 确定根节点;
  2. 在中序遍历中确定根的左右子树的范围;
  3. 递归处理左右子树。

三、在树上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);//在下一个点继续搜索
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值