二叉树的创建及应用(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