二叉树的操作

来源:互联网 发布:mac版qq不能远程协助 编辑:程序博客网 时间:2024/05/16 12:33

对于二叉树的操作,做一个简单的总结;
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
原创粉丝点击