二叉树基本功能的汇集(C++类实现)

来源:互联网 发布:java 颜色选择控件 编辑:程序博客网 时间:2024/05/29 15:44

二叉树是程序应用得比较多的一种结构。它可以反映物体之间的层次结构,还能通过孩子和双亲反映两物体之间某些特殊关系;排序二叉树还能帮助我们进行排序,并因此而提供快速的查找;二叉树基础上的伸展树能不断地优化我们系统的结构。并查集能很好地让我们进行分类;小根堆能帮助我们快速找到值最小的结点,它是优先队列的雏形。所有的这些都是以二叉树为基础的。

我实现的二叉树的基本功能包括前中后序的递归和非递归访问,求结点个数和叶子结点个数,还有求树高。这些是用C++类实现的。


BTree.h文件(类声明文件)

#ifndef BTREE_H#define BTREE_Hstruct BTreeNode{int data;BTreeNode *lChild,*rChild;};class BTree{public:void setRoot(BTreeNode* r){ root=r;}BTreeNode* getRoot(){ return root;}//中序遍历(递归)void inOrder();//中序遍历(非递归)void NotReInOrder();BTreeNode* createBTree();//前序遍历(递归)void preOrder();//前序遍历(非递归)void NotRePreOrder();//后序遍历(递归)void postOrder();//后序遍历(非递归)void NotRePostOrder();//求结点个数int BTreeSize();//求叶子结点个数int BTreeLeaves();//求树高int BTreeHeight();//层次法求树高int layerHeight();protected://中序遍历void inOrder(BTreeNode*);//前序遍历void preOrder(BTreeNode*);//后序遍历void postOrder(BTreeNode*);//结点个数int BTreeSize(BTreeNode*);//叶子结点int BTreeLeaves(BTreeNode*);//树高int BTreeHeight(BTreeNode*);private:BTreeNode* root;};#endif




BTree.cpp(类的实现文件)


#include <iostream>#include <stack>#include <queue>#include "BTree.h"using namespace std;//建立二叉树的算法BTreeNode* BTree::createBTree(){BTreeNode* current=0;int val=0;cin>>val;//-1的个数比数值的个数多1if(val==-1)return NULL;else{current=new BTreeNode;current->data=val;current->lChild=createBTree();current->rChild=createBTree();return current;}}//利用重载的方法void BTree::inOrder(){inOrder(root);cout<<endl;}//中序访问二叉树(递归)void BTree::inOrder(BTreeNode* r){if(r!=0) //是if,而不是while{inOrder(r->lChild); //递归访问cout<<r->data<<" ";inOrder(r->rChild); //递归访问}}//中序遍历(非递归)void BTree::NotReInOrder(){stack<BTreeNode*> s;BTreeNode* r=getRoot();while(!s.empty()||r!=0){while(r!=0){s.push(r);r=r->lChild;}if(!s.empty()){r=s.top();s.pop();cout<<r->data<<" ";r=r->rChild;}}}//重载形式void BTree::preOrder(){preOrder(root);cout<<endl;}//前序递归访问二叉树(递归)void BTree::preOrder(BTreeNode* r){if(r!=0) //是if,而不是while{cout<<r->data<<" ";preOrder(r->lChild); //递归访问preOrder(r->rChild); //递归访问}}//前序遍历(非递归)void BTree::NotRePreOrder(){stack<BTreeNode*> s;BTreeNode* r=getRoot();s.push(r);while(!s.empty()){r=s.top();s.pop();cout<<r->data<<" ";if(r->rChild!=0)s.push(r->rChild);if(r->lChild!=0)s.push(r->lChild);}}//重载形式void BTree::postOrder(){postOrder(root);cout<<endl;}//后序遍历(递归)void BTree::postOrder(BTreeNode* r){if(r!=0) //是if,而不是while{postOrder(r->lChild); //递归访问postOrder(r->rChild); //递归访问cout<<r->data<<" ";}}//后序非递归访问要定义新的结构体类型struct Node{BTreeNode* tp;bool flag;};//后序遍历(非递归)void BTree::NotRePostOrder(){Node node; //定义Node结构体的一个结点stack<Node> s;BTreeNode* r=getRoot();while(!s.empty()||r!=0){while(r!=0){node.tp=r;node.flag=0;s.push(node);r=r->lChild;}if(!s.empty()){node=s.top();s.pop();r=node.tp; //将栈顶的BTreeNode*部分赋给rif(node.flag==1){cout<<r->data<<" ";r=0; //表示已经访问了该结点}else{node.flag=1;s.push(node);r=r->rChild;}}}}//重载形式int BTree::BTreeSize(){return BTreeSize(root);}//求二叉树结点个数的函数int BTree::BTreeSize(BTreeNode* r){//二叉树的结点个数为左右子树的高度之和再+1if(r==0) return 0; elsereturn 1+BTreeSize(r->lChild)+BTreeSize(r->rChild);}//重载形式int BTree::BTreeLeaves(){return BTreeLeaves(root);}//求二叉树叶子结点个数的函数int BTree::BTreeLeaves(BTreeNode* r){//当为空时,返回0;当找到叶子时返回1if(r==0) return 0; elseif(r->lChild==0&&r->rChild==0)return 1;elsereturn BTreeLeaves(r->lChild)+BTreeLeaves(r->rChild);}//重载形式int BTree::BTreeHeight(){return BTreeHeight(root);}//求二叉树高度的函数int BTree::BTreeHeight(BTreeNode* r){if(r==0) return 0;else{//二叉树的高度为左右子树的最大者+1int lHei=BTreeHeight(r->lChild);int rHei=BTreeHeight(r->rChild);return (lHei>rHei) ? lHei+1:rHei+1;}}//层次遍历求树高需要利用的新结构struct LayerBTreeNode{BTreeNode* ptr;int height;};//层次遍历求高度int BTree::layerHeight(){queue<LayerBTreeNode> que;LayerBTreeNode temp,lTemp,rTemp; //牺牲空间来获得算法的清晰度BTreeNode* r=getRoot();int hei=1;temp.ptr=r;temp.height=1;que.push(temp); //先将根对应的LayerBTreeNode对象进队//不为空时while(!que.empty()){//BTreeNode* btreePtr=0;temp=que.front(); //取出队首元素que.pop();r=temp.ptr;//用当前的高度跟取出的队首进行比较if(hei<temp.height)hei=temp.height;if(r->lChild!=0||r->rChild!=0){//如果它的左右子树不为空,则进队列if(r->lChild!=0){lTemp.ptr=r->lChild;lTemp.height=temp.height+1; //在原来高度基础上加1,再入队列que.push(lTemp);}if(r->rChild!=0){rTemp.ptr=r->rChild;rTemp.height=temp.height+1;que.push(rTemp);}}}return hei;}



原创粉丝点击