数据结构实验--------二叉树(Binary Tree)
来源:互联网 发布:恐怖海峡知乎 编辑:程序博客网 时间:2024/06/01 23:20
使用的教材是电子工业出版社出版的《Data Structures and Algorithm Analysis in C++ 》(《数据结构与算法分析(C++)》(第三版)),作者是【美】Clifford A Shaffer,译者是张铭、刘晓丹等。所以,有些代码与书上给出来的几近相同,如有侵权,请联系本人(741239458@qq.com),我会删除文章的。
实验内容:1、编写递归函数search, 传入参数为一棵二叉树和一个值k, 如果值k 出现在树中则返回true, 否则返回flase。
2、编写递归函数返回二叉树的高度。
3、编写递归函数计算二叉树的叶结点数。
4、按广度优先搜索树。
------------BSTNode.h----------------
//节点的ADTtemplate<typename E>class BinNode{public: virtual ~BinNode() {}virtual E& element() =0 ;virtual void setElement(const E& ) =0;virtual BinNode* left() const = 0;virtual void setLeft(BinNode* ) =0;virtual BinNode* right() const =0;virtual void setRight(BinNode*) = 0;virtual bool isLeaf() = 0;};template<typename E>class BSTNode:public BinNode<E>{private: char k;E it;BSTNode* lc;BSTNode* rc;public: BSTNode(){ lc = rc = NULL;}BSTNode(char temp, E e, BSTNode* l=NULL, BSTNode* r=NULL){ k = temp;it = e;lc = l;rc = r;}~BSTNode() {}E& element(){ return it;}void setElement(const E& e){ it = e;}char& key() { return k; }void setKey(const char& temp ) { k = temp;}inline BSTNode* left() const{ return lc;}void setLeft(BinNode<E>* b){ lc = (BSTNode*) b;}inline BSTNode* right() const{ return rc;}void setRight(BinNode<E>* b){ rc = (BSTNode*) b;}bool isLeaf(){ return lc==NULL&&rc==NULL;}};//队列的ADTtemplate<typename E>class Queue{void operator = (const Queue&) {}Queue(const Queue&) {}public:Queue() {}virtual ~Queue() {}virtual void clear() = 0;virtual void enqueue(BSTNode<E>*) = 0;virtual BSTNode<E>* dequeue() = 0;virtual const BSTNode<E>* frontValue() const = 0;virtual int length() const = 0;};template<typename E>class Knot{public:BSTNode<E>* value;Knot* next;Knot( BSTNode<E>* v = NULL ,Knot* n = NULL){value = v;next = n;}};template<typename E>class Lqueue : public Queue<E>{int size;Knot<E>* front;Knot<E>* rear;public :Lqueue() { front = rear = new Knot<E>(); size = 0; }~Lqueue() { clear(); delete front; }void clear(){while(front->next != NULL){rear = front->next;delete rear;}rear = front;size = 0;}void enqueue( BSTNode<E>* it){rear->next = new Knot<E>(it,NULL);rear = rear->next;size++;}BSTNode<E>* dequeue(){if(size==0)return NULL;BSTNode<E>* it = front->next->value;Knot<E>* temp = front->next;front->next = temp->next;size--;if(size==0)rear = front;delete temp;temp = NULL;return it;}const BSTNode<E>* frontValue() const{return front->next->value;}int length() const{return size;}};
------------Main.cpp----------
#include<iostream>#include"BSTNode.h"using namespace std;//二叉树进行搜索template<typename E>bool search(BSTNode<E>* root,char temp){ if(root==NULL) return false;if(root->key()==temp) return true;if(search(root->left(),temp)) return true;return search(root->right(),temp);}//返回树的高度template<typename E>int getHight(BSTNode<E>* root){int h = 0,h1 = 0;if(root == NULL)return h;else{h1 = h = 1;}h += getHight(root->left());h1 += getHight(root->right());return h > h1? h : h1;}//返回叶子数template<typename E>int getNumOfLeaves(BSTNode<E>* root){if(root == NULL)return 1;return getNumOfLeaves(root->left())+getNumOfLeaves(root->right());}//build the tree/* A(0) -----/ \----- | | B(1) C(2)----/\----- ----/\----| | | |D(3) E(4) F(5) G(6) */template<typename E>void asign(BSTNode<E>*& root){root = new BSTNode<int>('A',0);root->setLeft(new BSTNode<int>('B',1));root->setRight(new BSTNode<int>('C',2));BSTNode<E>* temp = root->left();temp->setLeft(new BSTNode<int>('D',3));temp->setRight(new BSTNode<int>('E',4));temp = root->right();temp->setLeft(new BSTNode<int>('F',5));temp->setRight(new BSTNode<int>('G',6));}//广度搜索二叉树template<typename E>void breadthFirstSearch(BSTNode<E>*& root){Lqueue<E> lq;lq.enqueue(root);//记录树遍历的层数,用于决定什么时候换行int h = getHight(root);int* level = new int[h];int i = 0;for(;i<h;i++)level[i] = 0;i = 0;level[i]++;while(lq.length()>0){BSTNode<E>* temp = lq.dequeue();level[i]--;if(temp->left()!=NULL){lq.enqueue(temp->left());level[i+1]++;}if(temp->right()!=NULL){lq.enqueue(temp->right());level[i+1]++;}cout<<temp->key()<<" ";if(level[i]==0){i++;cout<<endl;}}}int main(){BSTNode<int>* root = NULL;asign<int>(root);cout<<"search 'E' is :";if(search(root, 'E'))cout<<"true"<<endl;elsecout<<"false"<<endl;cout<<"search 'J' is :";if(search(root, 'J'))cout<<"true"<<endl;elsecout<<"false"<<endl;cout<<"The hight of the tree is :"<<getHight<int>(root)<<endl;cout<<"The count of the leaf is :"<<getNumOfLeaves<int>(root)<<endl;cout<<"Breadth first search tree is:\n";breadthFirstSearch<int>(root);system("PAUSE");}
运行截图:
0 0
- 数据结构实验--------二叉树(Binary Tree)
- 数据结构-二叉树(Binary Tree)
- 数据结构:线索二叉树(Threaded Binary Tree)
- 基本数据结构:二叉树(binary tree)
- 数据结构 五:二叉树(Binary Tree)
- 数据结构-二叉树(binary tree)-二叉查找树(binary search tree)
- 【数据结构与算法基础】二叉查找树 / Binary Search Tree
- 数据结构 《5》----二叉搜索树 ( Binary Search Tree )
- 数据结构《9》----Threaded Binary Tree 线索二叉树
- 数据结构之二叉树的遍历 HDU1710 Binary Tree Traversals
- Javascript数据结构之禅:二叉查找树(Binary Search Tree)
- 数据结构-查找二叉树(Binary Sort Tree)
- 二叉树Binary Tree
- 二叉树 Binary Tree
- Binary tree,二叉树
- 二叉树(Binary Tree)
- Binary Tree 二叉树
- Javascript数据结构之禅:平衡二叉树(Balanced Binary Tree, AVL Tree)
- jquery获取复选框的值
- 判断app是否安装百度地图,并启动导航 ios
- linux命令eval的用法
- Hbase的regionServer无法启动报ClockOutOfSyncException解决方法
- js和jq中的绑定事件
- 数据结构实验--------二叉树(Binary Tree)
- 函数和抽象基类
- Git 服务器部署
- Android 5.0 ART GC 对比 Android 4.x Dalvik GC
- $()和${}和$(())和(())
- 为该函数体
- 账号策略
- jQuery Ajax三级联动
- mysql "ON DUPLICATE KEY UPDATE" 语法