• 二叉树的操作


    对于二叉树的操作,做一个简单的总结;
    Tips:针对于不论什么树的操作,首先须要推断是不是空树
    树的结构体
    int index = 0;

    typedef struct BiTree
    {
        int data;
        BiTree* lchild;
        BiTree* rchild;
    }*Tree;
    

    创建树的操作:

    void createBT(Tree &root,int data[])
    {
        int value = data[index++];
        if(value == -1)
        {
            root = NULL;
        }
        else
        {
            root = new BiTree;
            root->data = value;
            createBT(root->lchild,data);
            createBT(root->rchild,data);
        }
    }

    计算结点个数:

    int Count_Leaf(Tree &root)
    {
        int count = 0;
        if(!root)
        {
            return count;
        }
        count = Count_Leaf(root->lchild)+Count_Leaf(root->rchild)+1;
        return count;
    }

    计算树中叶子结点个数

    int Count(Tree &root)
    {
        if(!root)
            return 0;
        if(root->lchild == NULL && root->rchild == NULL)
            return 1;
        int numLeft = Count(root->lchild);
        int numRight = Count(root->rchild);
        return (numLeft+numRight);
    }

    二叉树的深度:

    int BT_depth(Tree &root)
    {
        if(!root)
            return 0;
        int depth_left = BT_depth(root->lchild)+1;
        int depth_right = BT_depth(root->rchild)+1;
        return depth_left>depth_right?

    depth_left:depth_right; }

    二叉树的bfs遍历:

    void Level(Tree &root)
    {
        cout << "二叉树的层次遍历" << endl;
        queue<BiTree*> que;
        if(!root)
            return;
        que.push(root);
        while(!que.empty())
        {
            root = que.front();
            que.pop();
            cout << root->data << " ";
            if(root->lchild)
                que.push(root->lchild);
            if(root->rchild)
                que.push(root->rchild);
        }
    }

    二叉树的dfs遍历:

    void dfs(Tree &root)
    {
        stack<BiTree*> s;
        if(!root)
            return;
        s.push(root);
        while(!s.empty())
        {
            root = s.top();
            cout << root->data << " ";
            s.pop();
            if(root->rchild)
                s.push(root->rchild);
            if(root->lchild)
                s.push(root->lchild);
        }
    }

    二叉树第K层结点数:

    int K_level(Tree &root,int k)
    {
        if(!root || k<1)
            return 0;
        if(k == 1)
            return 1;
        int numLeft = K_level(root->lchild,k-1);
        int numright = K_level(root->rchild,k-1);
        return (numLeft+numright);
    }

    推断俩个二叉树是否是一样的?

    bool Same_BT(Tree &root1,Tree &root2)
    {
        if(!root1 && !root2)
            return true;
        if(!root1 || !root2)
            return false;
        bool leftSame = Same_BT(root1->lchild,root2->lchild);
        bool rightSame = Same_BT(root1->rchild,root2->rchild);
        return (leftSame&&rightSame);
    }

    二叉树的镜像:

    BiTree* Mirror(Tree &root)
    {
        if(!root)
            return NULL;
        BiTree* left = Mirror(root->lchild);
        BiTree* right = Mirror(root->rchild);
        root->lchild = right;
        root->rchild = left;
        return root;
    }

    是否是平衡二叉树:

    bool isAVL(Tree &root,int &height)
    {
        if(!root)
        {
            height = 0;
            return true;
        }
        int heightLeft;
        bool left = isAVL(root->lchild,heightLeft);
        int heightRight;
        bool right = isAVL(root->rchild,heightRight);
        if(left && right && abs(heightLeft-heightRight)<=1)
        {
            height = max(heightLeft,heightRight)+1;
            return true;
        }
        else
        {
             height = max(heightLeft,heightRight)+1;
             return false;
        }
    }

    操作的main()函数:

    int main()
    {
        int data[] = {8,6,4,-1,-1,7,-1,-1,10,9,-1,-1,11,-1,-1};
        int data1[] = {8,6,4,-1,-1,7,-1,-1,10,9,-1,-1,11,-1,-1};
        Tree tree;
        Tree tree1;
        createBT(tree,data);
        /*
        //int height;
        if(isAVL(tree,height))
        {
            cout << "isAVL" << endl;
        }*/
        createBT(tree1,data1);
    
        if(Same_BT(tree,tree1))
        {
            cout<< "这俩二叉树是一样的" << endl;
        }
        else
        {
            cout << "这俩二叉树是不一样的" << endl;
        }
        //cout << "二叉树的叶子节点个数" << endl;
        //cout<<Count_Leaf(tree);
        //cout<<Count(tree)<<endl;
        //cout<<BT_depth(tree);*/
        //Level(tree);
    
        //cout << endl;
        //Mirror(tree);
        //Level(tree);
        //cout<< endl;
       // dfs(tree);
       //cout<< K_level(tree,3)<<endl;
        return 0;
    }
  • 相关阅读:
    吴裕雄--天生自然 pythonTensorFlow自然语言处理:Attention模型--测试
    吴裕雄--天生自然 pythonTensorFlow自然语言处理:Attention模型--训练
    吴裕雄--天生自然 pythonTensorFlow自然语言处理:Seq2Seq模型--测试
    吴裕雄--天生自然 pythonTensorFlow自然语言处理:Seq2Seq模型--训练
    吴裕雄--天生自然 pythonTensorFlow自然语言处理:PTB 语言模型
    吴裕雄--天生自然 pythonTensorFlow自然语言处理:文本数据预处理--生成训练文件
    吴裕雄--天生自然 pythonTensorFlow自然语言处理:文本数据预处理--生成词汇表
    吴裕雄--天生自然 pythonTensorFlow自然语言处理:交叉熵损失函数
    HihoCoder 1097 kruscal
    HihoCoder 1097 Prim算法
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5363483.html
Copyright © 2020-2023  润新知