• 算法竞赛模板 二叉树


    ①二叉树结点定义
    struct TreeNode{
        int val;
        TreeNode*left,*right;
        TreeNode(){}
        TreeNode(int val):val(val),left(NULL),right(NULL){}
    };
    定义二叉树结点
     
     
    ②二叉树遍历方式
    void Preorder(TreeNode*root)
    {
        if(root)
        {
            printf("%d ",root->val);
            Preorder(root->left);
            Preorder(root->right);
        }
    }
    先序遍历
    void Inorder(TreeNode*root)
    {
        if(root)
        {
            Inorder(root->left);
            printf("%d ",root->val);
            Inorder(root->right);
        }
    }
    中序遍历
    void Postorder(TreeNode*root)
    {
        if(root)
        {
            Postorder(root->left);
            Postorder(root->right);
            printf("%d ",root->val);
        }
    }
    后序遍历
    void Levelorder(TreeNode*root)
    {
        int front=0,rear=1;
        TreeNode*qu[MaxSize],*p;
        qu[rear]=root;
        while(front!=rear)
        {
            p=qu[++front];
            printf("%d ",p->val);
            if(p->left)
                qu[++rear]=p->left;
            if(p->right)
                qu[++rear]=p->right;
        }
    }
    层次遍历
     
     
    ③二叉树基本操作
    TreeNode*createLevel()
    {
        int front=1,rear=0,x;
        TreeNode*qu[1005],*t,*root=NULL;
        while(cin>>x,x!=-1)
        {
            if(!x)
                t=NULL;
            else
            {
                t=new TreeNode;
                t->val=x;
                t->left=NULL;
                t->right=NULL;
            }
            qu[++rear]=t;
            if(rear==1)
                root=t;
            else
            {
                if(qu[front]&&t)
                {
                    if(rear%2==0)
                        qu[front]->left=t;
                    else
                        qu[front]->right=t;
                }
                if(rear%2==1)
                    front++;
            }
        }
        return root;
    }
    层次遍历建树
    int jud(TreeNode*left,TreeNode*right)
    {
        if(!left&&!right)
            return 1;
        if(!left||!right)
            return 0;
        if(left->val!=right->val)
            return 0;
        return jud(left->left,right->right)&&jud(left->right,right->left);
    }
    int isSymmetric(TreeNode*root)
    {
        if(!root)
            return 1;
        return jud(root->left,root->right);
    } 
    判断对称二叉树
    int maxDepth(TreeNode*root)
    {
        if(!root)
            return 0;
        int left=maxDepth(root->left)+1;
        int right=maxDepth(root->right)+1;
        return left>right?left:right;
    }
    求二叉树最大深度(根结点深度为1)
    int dis;
    int dfsDiameter(TreeNode*root)
    {
        if(!root)
            return 0;
        int x=dfsDiameter(root->left);
        int y=dfsDiameter(root->right);
        if(x+y>dis)
            dis=x+y;
        return x>y?x+1:y+1;
    }
    int Diameter(TreeNode*root)
    {
        dfsDiameter(root);
        return dis;
    }
    求二叉树的直径(任意两结点之间的路径最大值)

    ④二叉查找树(Binary Search Tree)

    又称:二叉搜索树,二叉排序树。

    它或是一棵空树,或是具有下列性质的二叉树:

    ① 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

    ② 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

    ③ 它的左、右子树也分别为二叉排序树。

    ps:如果中序遍历BST,会得到一个递增序列

    TreeNode*dfsBST(TreeNode*root,int x)
    {
        if(!root)
        {
            root=new TreeNode;
            root->val=x;
            root->left=NULL;
            root->right=NULL;
        }
        
        else if(x> root->val)
            root->right=dfsBST(root->right,x);
            
        else if(x<= root->val)
            root->left=dfsBST(root->left,x);
            
        return root;
    }
    TreeNode*createBST()
    {
        int nums[1005],Size,i;
        cin>>Size;
        for(i=0;i<Size;i++)
            cin>>nums[i];
            
        TreeNode*root=NULL;
        for(i=0;i<Size;i++)
            root=dfsBST(root,nums[i]);
        return root;
    }
    BST建树(先输入至数组,再建树)
    int L,R;//所取边界[L,R] 
    TreeNode*cutBST(TreeNode*root)
    {
        if(!root)
            return NULL;
        if(root->val<L)
            return cutBST(root->right);
        else if(root->val>R)
            return cutBST(root->left);
        else
        {
            root->left=cutBST(root->left);
            root->right=cutBST(root->right);
            return root;
        }
    }
    BST修剪(保留树内在[L,R]区间内的结点)
    TreeNode*searchBST(TreeNode*t,int x)
    {
        while(t)
        {
            if(x< t->val)
                t=t->left;
            else if(x> t->val)
                t=t->right;
            else
                return t;
        }
        return NULL;
    }
    BST查找
    void insertBST(TreeNode*&root,int x)
    {
        if(!root)
            root=new TreeNode(x);
        else if(root->val >x)
            insertBST(root->left,x);
        else if(root->val <x)
            insertBST(root->right,x); 
    }
    BST插入
    void deleteBST(TreeNode**root,int x)
    {
        TreeNode*t=*root;
        TreeNode*dad=*root;
        while(t)              //查找结点 
        {
            if(t->val==x)
                break;
            dad=t;            //此结点的父结点 
            if(t->val >x)
                t=t->left;
            else
                t=t->right;
        }
        if(!t)                //没有该结点就跳出 
            return;
        if(t->left==NULL&&t->right==NULL) //是叶子结点 
        {
            if(t==*root)      //是根结点 
                *root=NULL;
            else if(dad->left==t)
                dad->left=NULL;
            else
                dad->right=NULL;
            delete t;
        }
        else if(t->left==NULL||t->right==NULL)  //该结点是单支结点
        {
            if(t==*root)      //是根结点
            {
                if(t->left)
                    *root=t->left;
                else
                    *root=t->right;
            }
            else if(dad->left==t)
            {
                if(t->left)
                    dad->left=t->left;
                else
                    dad->left=t->right;
            }
            else
            {
                if(t->left)
                    dad->right=t->left;
                else
                    dad->right=t->right;
            }
            delete t;
        }
        else    //该结点是双支结点
        {
            TreeNode*par=t;
            TreeNode*child=t->right;
            while(child->left)
            {
                par=child;
                child=child->left;
            }
            t->val=child->val;
            if(par==t)
                t->right=child->right;
            else 
                par->left=child->right;
            delete child;
        }
    } 
    BST删除

    ⑤平衡二叉搜索树(Self-balancing Binary Search Tree)

    它或是一棵空树,或是具有下列性质的二叉树:

    ① 它的左右两个子树的高度差的绝对值不超过1;

    ② 它左右两个子树都是一棵平衡二叉树。

    int flag=1;
    int dfsBalance(TreeNode*root)
    {
        if(!root)
            return 0;
        int x=dfsBalance(root->left)+1;
        int y=dfsBalance(root->right)+1;
        
        if(abs(x-y)>1)
            flag=0;
            
        return x>y?x:y;
    }
    int isBalance(TreeNode*root)
    {
        dfsBalance(root);
        return flag; //若是 返回1,不是返回0 
    }
    判断平衡二叉树
  • 相关阅读:
    Java学习之Math类理解
    Java学习之集合框架的迭代器--Iteratorjk及ListItertor接口
    Java学习关于随机数工具类--Random类
    集合框架学习之List接口
    Java学习关于集合框架的基础接口--Collection接口
    Java基础学习之数组基本属性和方法
    Java学习关于时间操作的应用类--Date类、Calendar类及其子类
    Java学习--异常处理及其应用类
    LR百分比模式
    lr函数之lr_eval_string()函数的使用学习
  • 原文地址:https://www.cnblogs.com/kannyi/p/9077357.html
Copyright © 2020-2023  润新知