S-Trees(二叉树)

Question:题目详情(http://vjudge.net/contest/134361#problem/E)
题目大意:有一个n层的满二叉树,每个子节点都对应了一个确定的值(共2^n个),有m个访问值,每个访问值由n个0,1组成,0表示走左子节点,1表示走右子节点,这样每个访问值都对应了原二叉树的子节点的一个确定的值,最后输出m个访问值
解题思路:先用一个数组保存下2^n个节点的值,然后将输入的每个访问值,由二进制转化为10进制数,然后找到对应的保存节点数组的值,用另一个数组保存答案

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn=500005;
int a[maxn],ans[maxn],ncase;  //ans保存答案,a保存节点的值
int main()
{
    int n,m;
    while(scanf("%d",&n),n)
    {
        for(int i=1;i<=n;i++)
        {
            char c;
            int k;
            getchar();
            scanf("%c%d",&c,&k);   //这里的输入个人理解没有太大的意义
        }
        for(int i=0;i<pow(2,n);i++)
            scanf("%1d",&a[i]);  //保存各个节点的值
        scanf("%d",&m);
        for(int i=1;i<=m;i++)
        {
            int sum=0;
            for(int j=1;j<=n;j++)
            {
                int tp;
                scanf("%1d",&tp);
                if(tp)
                    sum+=pow(2,n-j);  //将输入的访问值变为十进制数
            }
            ans[i]=a[sum];  //最终答案保存在ans数组里
        }
        printf("S-Tree #%d:\n",++ncase);
        for(int i=1;i<=m;i++)
            printf("%d",ans[i]);
        printf("\n\n");  //注意,这里输出之间隔了一行
    }
    return 0;
}

体会:这道题没有太大的难度,只要想通了,自然迎刃而解了

### Python 实现二叉树并查找子树 #### 定义二叉树节点类 为了实现二叉树以及在其上执行操作,首先需要定义一个表示二叉树节点的类 `TreeNode`。此类包含三个属性:当前节点存储的值 (`value`)、指向左孩子的指针 (`left`) 以及指向右孩子的指针 (`right`)。 ```python class TreeNode: def __init__(self, value=0, left=None, right=None): self.value = value self.left = left self.right = right ``` #### 构建二叉树实例 通过上述定义好的 `TreeNode` 类型对象来创建具体的二叉树结构。可以通过设置各个节点之间的连接关系完成整棵树的建立[^2]。 #### 子树匹配函数设计 对于给定的一棵大树 T 和一棵小树 S ,要判断S 是否为T 的子树,则可以从根结点开始比较两棵树是否相同;如果不同则继续分别尝试用T 左/右分支作为新的大数再做同样的对比直到找到完全一致的部分为止或者遍历结束仍无果返回False 。这里给出一种基于递归的方法: ```python def is_subtree(large_tree_node, small_tree_node): if not large_tree_node and not small_tree_node: return True if not large_tree_node or not small_tree_node: return False # Check from root node of both trees. same_trees = are_identical(large_tree_node, small_tree_node) # If the above call returns false then check for subtree in left and right children of larger tree if same_trees: return True else: return (is_subtree(large_tree_node.left, small_tree_node) or is_subtree(large_tree_node.right, small_tree_node)) def are_identical(root1, root2): """Helper function to determine whether two binary trees rooted at given nodes are identical.""" if not root1 and not root2: return True if not root1 or not root2: return False return ((root1.value == root2.value) and are_identical(root1.left , root2.left ) and are_identical(root1.right, root2.right)) ``` 这段代码实现了两个主要功能:一是检测整个二叉树是否相等(`are_identical`);二是检查较小的那颗二叉树是不是较大一颗中的某个部分即所谓的“子树”(`is_subtree`). 这里采用的是先序的方式来进行逐层深入地验证每一个可能成为候选者的节点及其后代们是否存在符合条件的情况[^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值