树的子结构+重建二叉树

树的结构的定义是一个递归的定义。树是n个结点的有限集。在任意一棵非空树中(1)有且仅有一个特定的称为的结点(2)n>1时其余结点可分为m个互不相交的有限集,其中每一个集合本身又是一棵树,并且称为根的子树

二叉树的实现和遍历

二叉树的四个性质:1.2.3.4.节点数目为k的完全二叉树的数目

先序遍历:先访问根节点;再递归地访问左子树;再递归

面试题:树的子结构

class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
        bool result=false;//采用先序遍历
        if(pRoot1!=NULL&&pRoot2!=NULL){
            if(pRoot1->val==pRoot2->val)
                result=DoesTree1HaveTree2(pRoot1, pRoot2);
                if(!result) {
                    result=HasSubtree(pRoot1->left, pRoot2);
                }
                if(!result) {
                    result=HasSubtree(pRoot1->right, pRoot2);
                }
            }
        return result;
    }
    bool DoesTree1HaveTree2(TreeNode* pRoot1,TreeNode* pRoot2){
        if(pRoot2==NULL) return true;//这两行代码的顺序不能改!说明了树B已经匹配完成,越过了叶子节点了
        if(pRoot1==NULL) return false;//说明已经越过了树A的叶子节点了,匹配失败
        if(pRoot1->val!=pRoot2->val) return false;
        return DoesTree1HaveTree2(pRoot1->left, pRoot2->left)&& DoesTree1HaveTree2(pRoot1->right, pRoot2->right);
    }
};

面试题:重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。(没有这个不含重复数字的条件就没法用这个算法做)思路如下,采用递归的方式,要注意递归函数的返回条件。

 

class Solution {
public:
    TreeNode* buildTreeCore(const vector<int>& preorder, const vector<int>& inorder, int preleft, int preright, int inleft, int inright){
        int n=preorder.size();
        if(preleft>preright) return NULL;//注意此处
if(inleft>inright) return NULL;//加不加这一句都可以通过
        TreeNode* a=new TreeNode();
        a->val=preorder[preleft];
        //前序遍历的第一个节点就是根节点的值,找中序遍历中根节点的位置
        int rootinorder=0;
        while(rootinorder<n){
            if(inorder[rootinorder]==preorder[preleft]){
                break;
            }
            ++rootinorder;
        }
        int size_left_subtree=rootinorder-inleft;
        //得到左子树中的结点数目
        //构建左子树
        a->left=buildTreeCore(preorder,inorder,preleft+1,preleft+size_left_subtree,inleft,rootinorder-1);
        //构建右子树
        a->right=buildTreeCore(preorder,inorder,preleft+size_left_subtree+1,preright,rootinorder+1,inright);
       return a;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
         if(preorder.empty()||inorder.empty()) return NULL;
         //可以保证下面的都至少有一个结点
         return buildTreeCore(preorder,inorder,0,preorder.size()-1,0,inorder.size()-1);
    }
};

 

 如果已知中序和后序要确定先序:(似乎只要知道中序和另外一个,就可以确定这个二叉树了)

 

typedef struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
} TreeNode;
void preOrderTraverse(TreeNode* root){
    if(root==NULL) return;
    cout<<root->val<<" ";
    preOrderTraverse(root->left);
    preOrderTraverse(root->right);
}
TreeNode* buildTree(const vector<int>& inorder,const vector<int>& postorder,int inleft, int inright,int postleft,int postright){
    int n=inorder.size();
    if(inleft>inright) return NULL;
    if(postleft>postright) return NULL;
    TreeNode* a=new TreeNode();//
    a->val=postorder[postright];
    int rootinorder=0;
    while(rootinorder<n){
        if(inorder[rootinorder]==postorder[postright]){
            break;
        }
        rootinorder++;
    }
    //得到左子树的节点数目
    int size_left_subtree=rootinorder-inleft;
    a->left=buildTree(inorder,postorder,rootinorder-size_left_subtree,rootinorder-1,postleft,postleft+size_left_subtree-1);
    a->right=buildTree(inorder,postorder,rootinorder+1,inright,postleft+size_left_subtree,postright-1);
    return a;
}
int main(){
    vector<int> inorder={9,3,15,20,7};
    vector<int> postorder={9,15,7,20,3};
    int n=inorder.size();
    TreeNode* root=buildTree(inorder,postorder,0,n-1,0,n-1);
    preOrderTraverse(root);
    return 0;
}

 

数据治理是确保数据准确性、可靠性、安全性、可用性和完整性的体系和框架。它定义了组织内部如何使用、存储、保护和共享数据的规则和流程。数据治理的重要性随着数字化转型的加速而日益凸显,它能够提高决策效率、增强业务竞争力、降低风险,并促进业务创新。有效的数据治理体系可以确保数据在采集、存储、处理、共享和保护等环节的合规性和有效性。 数据质量管理是数据治理中的关键环节,它涉及数据质量评估、数据清洗、标准化和监控。高质量的数据能够提升业务决策的准确性,优化业务流程,并挖掘潜在的商业价值。随着大数据和人工智能技术的发展,数据质量管理在确保数据准确性和可靠性方面的作用愈发重要。企业需要建立完善的数据质量管理和校验机制,并通过数据清洗和标准化提高数据质量。 数据安全与隐私保护是数据治理中的另一个重要领域。随着数据量的快速增长和互联网技术的迅速发展,数据安全与隐私保护面临前所未有的挑战。企业需要加强数据安全与隐私保护的法律法规和技术手段,采用数据加密、脱敏和备份恢复等技术手段,以及加强培训和教育,提高安全意识和技能水平。 数据流程管理与监控是确保数据质量、提高数据利用率、保护数据安全的重要环节。有效的数据流程管理可以确保数据流程的合规性和高效性,而实时监控则有助于及时发现并解决潜在问题。企业需要设计合理的数据流程架构,制定详细的数据管理流程规范,并运用数据审计和可视化技术手段进行监控。 数据资产管理是将数据视为组织的重要资产,通过有效的管理和利用,为组织带来经济价值。数据资产管理涵盖数据的整个生命周期,包括数据的创建、存储、处理、共享、使用和保护。它面临的挑战包括数据量的快速增长、数据类型的多样化和数据更新的迅速性。组织需要建立完善的数据管理体系,提高数据处理和分析能力,以应对这些挑战。同时,数据资产的分类与评估、共享与使用规范也是数据资产管理的重要组成部分,需要制定合理的标准和规范,确保数据共享的安全性和隐私保护,以及建立合理的利益分配和权益保障机制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值