博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树的操作
阅读量:6234 次
发布时间:2019-06-22

本文共 3467 字,大约阅读时间需要 11 分钟。

对于二叉树的操作,做一个简单的总结;

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
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
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<

转载地址:http://lhqna.baihongyu.com/

你可能感兴趣的文章
VS2010远程调试C#程序
查看>>
[MicroPython]TurniBit开发板DIY自动窗帘模拟系统
查看>>
Python3.4 12306 2015年3月验证码识别
查看>>
从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)
查看>>
windows查看端口占用
查看>>
Yii用ajax实现无刷新检索更新CListView数据
查看>>
JDBC的事务
查看>>
Io流的概述
查看>>
App 卸载记录
查看>>
JavaScript变量和作用域
查看>>
开源SIP服务器加密软件NethidPro升级
查看>>
作业:实现简单的shell sed替换功能和修改haproxy配置文件
查看>>
Altium 拼板方法以及 注意的 地方
查看>>
Apache Pulsar中的地域复制,第1篇:概念和功能
查看>>
python pip install 出现 OSError: [Errno 1] Operation not permitted
查看>>
oracle12C 重做日志
查看>>
从源码分析scrollTo、scrollBy、Scroller方法的区别和作用
查看>>
ObjectOutputStream和ObjectInputStream
查看>>
nagios客户端未启动报错
查看>>
南京大学周志华教授当选欧洲科学院外籍院士
查看>>