1月6日刷题总结

新二叉树
题目描述
有一个 n(n \le 10^6) n( n≤106) 个结点的二叉树。给出每个结点的两个子结点编号(均不超过 n n),建立一棵二叉树(根节点的编号为 11),如果是叶子结点,则输入 0 0。
建好这棵二叉树之后,请求出它的深度。二叉树的 深度是指从根节点到叶子结点时,最多经过了几层。
输入格式
第一行一个整数 n n,表示结点数。
之后 n n 行,第 i i 行两个整数 l l、r r,分别表示结点 i i 的左右子结点编号。若 l=0 l=0 则表示无左子结点,r=0 r=0 同理。
输出格式
一个整数,表示最大结点深度。
输入输出样例
输入 #1复制
7 2 7 3 6 4 5 0 0 0 0 0 0 0 0
输出 #1复制
4

思路:利用结构体存储左右结点,对结构体进行搜索,找到最大深度

#include<bits/stdc++.h>
using namespace std;
int ans=0;
struct node//用结构体存储左右子树
{
    int l,r;
}a[1000001];
void dfs(int root,int step)
{
    if(root==0)return ;//等于0的时候说明没有子节点了,即返回
    ans=max(ans,step);//使得ans始终为最大值(即最大深度)
    dfs(a[root].l,step+1);//到下一个左子结点,同时深度+1
    dfs(a[root].r,step+1);//同上
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&a[i].l,&a[i].r);//输入i的左右结点
    }
    dfs(1,1);
    printf("%d",ans);
}


遍历问题
题目描述
我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。然而给定一棵二叉树的前序和后序遍历,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树:

所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却不相同。
输入格式
输A数据共两行,第一行表示该二叉树的前序遍历结果s1,第二行表示该二叉树的后序遍历结果s2。
输出格式
输出可能的中序遍历序列的总数,结果不超过长整型数。
输入输出样例
输入 #1复制
abc cba
输出 #1复制
4
说明/提示
无提示

思路:二叉树对左右结点的规定十分严格,当只有一个子节点的时候,该树有2种组合。所以我们只要求出只有一个子节点的位置的个数,然后就是求这几个结点所可以构造的树的种类,所以就是2^结点数量。这里特别说一下只有一个子节点的特征:我们可以想到前序遍历是根左右,后序遍历是左右根,当只有一个结点的时候(假设是左结点存在)前序遍历是根左,后序遍历是左根,(右结点存在的时候)前序遍历时根右,后序遍历是右根,我们可以发现,后序遍历和前序遍历刚好相反,因此我们可以遍历其后序和前序的数组,找出相反的个数。

#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
    char prech[27],endch[27];
    int ans=0;
    scanf("%s",prech);//输入
    scanf("%s",endch);
    for(int i=0;i<strlen(prech);i++)
    {
        for(int j=1;j<strlen(prech);j++)//此处遍历从1开始,因为下面的后序数组中存在j-1(从0开始会越界)
        {
            if(prech[i]==endch[j]&&prech[i+1]==endch[j-1])//求出只有一个子结点的结点
            ans++;
        }
    }
    int k=pow(2,ans);
    printf("%d",k);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡卡卡卡罗特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值