二叉树的创建及应用(c++)
来源:互联网 发布:js杀破狼为什么不给听 编辑:程序博客网 时间:2024/05/28 22:10
/*二叉树*/#include<iostream>using namespace std;class Node{public:int date; //存放数据Node* lChild; //记录左孩子结点Node* rChild; //记录右孩子结点//给定数据的构造函数Node(int num=0):date(num){lChild=rChild=0;}//给定数据和左右孩子结点的构造函数Node(int num,Node* l,Node* r):date(num),lChild(l),rChild(r){}//判断该结点是否是叶子节点,是,返回truebool isLeaf()const{if(lChild==0&&rChild==0)return true;elsereturn false;}//顺序添加孩子结点int getChild(Node* child){if(isLeaf()){lChild=child;return -1;}else if(rChild==0){rChild=child;return 1;}else{cout<<"不能添加孩子结点"<<endl;return 0;}}};//////////////////////////////////////Node类////////////////////////////////////////////////////////class BinaryTree : public Node{Node* root; //二叉树根结点public://默认构造函数BinaryTree(){this->root=create();}//给定根结点数据的构造函数BinaryTree(int num){root=new Node(num);}//析构函数~BinaryTree(){Delete(root);}//返回二叉树根结点Node* getRoot(){return root;}//返回根结点//删除以root为根结点的子树void Delete(Node* root){if(root!=0){Delete(root->lChild); //释放左子树Delete(root->rChild); //释放右子树delete root;}}//创建二叉树Node* create(){Node *root;int date;cout<<"请输入节点数据:"<<endl;cin>>date;if(date==0)root=NULL;else{root=new Node;root->date=date;root->lChild=create();root->rChild=create();}return root;}//返回当前节点的左孩子节点Node* getlChild(Node* root){if(root)return root->lChild;}//返回当前节点的右孩子节点Node* getrChild(Node* root){if(root)return root->rChild;}//递归前序遍历void preOrder(Node* root){if(root&&root->date!=0){cout<<root->date<<ends;preOrder(root->lChild);preOrder(root->rChild);}}//度为1int link1(Node* root){if(root){if(root->lChild==0&&root->rChild!=0)return 1+link1(root->rChild);else if(root->lChild!=0&&root->rChild==0)return 1+link1(root->lChild);else if(root->lChild!=0&&root->rChild!=0)return link1(root->lChild)+link1(root->rChild);elsereturn 0;}}//度为2int link2(Node* root){if(root){if(root->lChild==0&&root->rChild!=0)return link2(root->rChild);else if(root->lChild!=0&&root->rChild==0)return link2(root->lChild);else if(root->lChild!=0&&root->rChild!=0)return 1+link2(root->lChild)+link2(root->rChild);elsereturn 0;}}//度为0int link0(Node* root){if(root){if(root->lChild==0&&root->rChild==0)return 1;elsereturn link0(root->lChild)+link0(root->rChild);}elsereturn 0;}//高度int high(Node* root){if(root){if(root->lChild==0&&root->rChild==0)return 1;elsereturn high(root->lChild)>high(root->rChild)?(high(root->lChild)+1):(high(root->rChild)+1);}elsereturn 0;}//宽度int width(Node* root){if(root){if(root->lChild==0&&root->rChild==0)return 1;else{int rlen=0,llen=0;if(root->lChild!=0)llen=width(root->lChild);if(root->rChild!=0)rlen=width(root->rChild);return rlen+llen;}}elsereturn 0;}//最大值int max(Node* root){if(root){if(root->date>max(root->lChild)&&root->date>max(root->rChild))return root->date;else if(max(root->lChild)>root->date&&max(root->lChild)>max(root->rChild))return max(root->lChild);elsereturn max(root->rChild);}elsereturn 0;}//交换左右孩子节点void change(Node* root){Node* p;if(root){if(root->lChild==0&&root->rChild!=0){change(root->rChild);root->lChild=root->rChild;root->rChild=0;}else if(root->lChild!=0&&root->rChild==0){change(root->lChild);root->rChild=root->lChild;root->lChild=0;}else if(root->lChild!=0&&root->rChild!=0){change(root->lChild);change(root->rChild);p=root->lChild;root->lChild=root->rChild;root->rChild=p;}}}//删去所有叶节点void det(Node* root){if(root){if(root->lChild==0&&root->rChild==0)root->date=0;else{det(root->lChild);det(root->rChild);}}}//判断是否为完全二叉树bool full(Node* root){if(root){if(root->lChild==0&&root->rChild!=0)return false;else if(root->lChild!=0&&root->rChild==0)return full(root->lChild);else if(root->lChild!=0&&root->rChild!=0){if(full(root->lChild)&&full(root->rChild))return true;elsereturn false;}elsereturn true;}}};int main(){BinaryTree bt;cout<<"前序遍历"<<endl;bt.preOrder(bt.getRoot());cout<<endl;if(bt.full(bt.getRoot()))cout<<"是完全二叉树"<<endl;elsecout<<"不是完全二叉树"<<endl;cout<<"二叉树中度为1的节点个数"<<endl;cout<<bt.link1(bt.getRoot())<<endl;cout<<"二叉树中度为2的节点个数"<<endl;cout<<bt.link2(bt.getRoot())<<endl;cout<<"二叉树中度为0的节点个数"<<endl;cout<<bt.link0(bt.getRoot())<<endl;cout<<"二叉树的高度"<<endl;cout<<bt.high(bt.getRoot())<<endl;cout<<"二叉树的宽度"<<endl;cout<<bt.width(bt.getRoot())<<endl;cout<<"二叉树中的最大值为"<<endl;cout<<bt.max(bt.getRoot())<<endl;cout<<"交换二叉树中左孩子节点和右孩子节点"<<endl;bt.change(bt.getRoot());cout<<"交换后二叉树前序遍历为"<<endl;bt.preOrder(bt.getRoot());cout<<endl;cout<<"删除二叉树中叶节点"<<endl;bt.det(bt.getRoot());cout<<"删除后二叉树前序遍历为"<<endl;bt.preOrder(bt.getRoot());cout<<endl;cout<<"删除后二叉树先序遍历为"<<endl;bt.preOrder(bt.getRoot());cout<<endl;return 0;}
1 0
- 二叉树的创建及应用(c++)
- 纯C创建二叉树及二叉树的遍历
- 二叉树的创建、遍历及搜索(C实现)
- c语言二叉树创建及遍历
- 二叉树及二叉树的应用
- 二叉树的创建及其简单应用
- c语言的二叉树的创建
- 二叉树的遍历及创建(java)
- 二叉树的创建及遍历方式
- 二叉树的创建及遍历
- 链式二叉树的创建及遍历
- 链式二叉树的创建及遍历
- 二叉树的创建及遍历
- 二叉树的创建,及遍历 操作
- 二叉树的创建及遍历
- 二叉树的创建及遍历实现
- 二叉树的创建及基本操作。
- 二叉树的创建及遍历
- nw.js 填坑
- 微信公众平台获取网页授权(测试号)
- bzoj 4519: [Cqoi2016]不同的最小割 最小割树
- 练习1122
- 左右法则
- 二叉树的创建及应用(c++)
- 文本样式
- 动态添加HTML标签中单引号,双引号的嵌套问题
- c++什么时候会生成默认构造函数
- 五、MongoDB的高可用,可伸缩架构
- Ubuntu下编写Android.mk文件编译生成.apk文件
- C/C++中const修饰符的用法总结
- Makefile经典案例
- StringBuffer的主要方法,及其与StringBuilder、String的关系