二叉树的操作

对于二叉树的操作,做一个简单的总结;
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值