二叉树

遍历方式


前序遍历: 根节点在前面,即根左右 上图结果为ABC
中序遍历: 根节点在中间,即左根右 上图结果为BAC
后序遍历: 根节点在后面,即左右根 上图结果为BCA
层序遍历:一层一层遍历 上图结果为ABC

前中后序遍历

此类题型就是提供中序遍历以及前序遍历和后序遍历中的一种,得到另外一种
例如提供前序遍历和中序遍历
每次递归查找此时的根节点并输出

void dfs(string pre,string in){
    if(pre.empty()) return;
    char c=pre[0];
    int k=in.find(c);
    dfs(pre.substr(1,k),in.substr(0,k));
    dfs(pre.substr(k+1),in.substr(k+1));
    cout<<c;
}

输出c的位置要注意,前序和后序不相同

层序遍历

提供层序遍历的结果,输出第k层的内容

long long i,n,k,f=0,d ;
    cin>>n;
    for(i=1;i<=n;i++){
        cin>>a[i];
    }
    cin>>k;
    d=power(2,k);
    for(i=d;i<=min(n,d*2);i++)
    {
        cout<<a[i]<<" ";
        f=1;
    }
    if(f==0){
        cout<<"EMPTY"<<endl;
    }
    return 0;

power函数可以用快速幂优化

特殊二叉树

满二叉树

k层树共有\(2^{k-1}\)个节点,

完全二叉树

从1-n个节点就是满二叉树中的1-n的节点

二叉搜索树

根节点一定大于左子树的值,一定小于右子树的值

树的遍历

先用vector存树的每一条边(单向只存一次)

for(int i=1,x,y;i<=n-1;i++){
        //int x,y;
        cin>>x>>y;
        e[x].push_back(y);
        e[y].push_back(y);
    }

再用dfs查找每一条边

void dfs(int x){
    for(auto i:e[x]) {
        if (f[i])
            continue;
        f[i]=1;
        dep[i]=dep[x]+1;
        dfs(i);
    }
}

树与二分图

所有的树都可以转化为二分图

二分图概念

顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。

树与二分图转化



由图中可知,树转化为二分图就是将树的奇数层和偶数层分开,所以要将树的每个点的深度存一下(树的遍历)

posted @ 2022-07-14 09:42  zyzzzzlh  阅读(64)  评论(1)    收藏  举报