南邮数据结构实验2 (1)二叉树基本操作

来源:互联网 发布:程序员客栈怎么接单 编辑:程序博客网 时间:2024/06/06 01:47

在二叉链表上实现二叉树运算

1.设计递归算法,实现下列二叉树运算:删除一棵二叉树,求一棵二叉树的高度,求一棵二叉树中叶子结点数,复制一棵二叉树,交换一棵二叉树的左右子树。

2.设计算法,按自上到下,自左向右的次序,即按层次遍历一棵二叉树。

3.设计main函数,测试上述每个运算。

4.提示:二叉树的按层次遍历需要利用队列作为辅助的数据结构,队列的元素类型是指向二叉树中结点的指针类型。


#include <iostream>#include <string>using namespace std;template<class T>struct BTNode   //结点类{BTNode(){lChild = rChild = NULL;}BTNode(const T& x){element = x;lChild = rChild = NULL;}BTNode(const T&x, BTNode<T>*l, BTNode<T>*r){element = x;lChild = l;rChild = r;}T element;BTNode<T> *lChild, *rChild;};template<class T>         //循环队列类class SeqQueue{public:SeqQueue(int mSize);~SeqQueue(){delete []q;}bool IsEmpty() const{return front == rear;}bool IsFull() const{return (rear + 1) % maxSize == front;}bool Front(BTNode<T> *&x)const;bool EnQueue(BTNode<T> *x);bool DeQueue();void Clear(){front = rear = 0;}private:int front, rear;int maxSize;BTNode<T> **q;};template<class T>SeqQueue<T>::SeqQueue(int mSize)   //构造函数{maxSize = mSize;q = new BTNode<T>*[maxSize];front = rear = 0;}template<class T>bool SeqQueue<T>::Front(BTNode<T> *&x)const    //取队头元素{if(IsEmpty())return false;x = q[(front+1) % maxSize];return true;}template<class T>bool SeqQueue<T>::EnQueue(BTNode<T> *x)    //在队尾插入x{if(IsFull()){cout << "Full" << endl;return false;}q[rear = (rear+1) % maxSize] = x;return true;}template<class T>bool SeqQueue<T>::DeQueue()   //删除队头元素{if(IsEmpty()){cout << "Underflow" << endl;return false;}front = (front+1) % maxSize;return true;}template<class T>      //Visit函数void Visit(T&x){    cout << x << " ";}template<class T>   //二叉树类class BinaryTree{public:BinaryTree():s(100){root = NULL;}~BinaryTree(){delete []root;}bool Clear();void MakeTree(const T&x,BinaryTree<T>&left,BinaryTree<T>& right);int High(BTNode<T>*p);int Node_num(BTNode<T>*p);    BTNode<T>*Copy (BTNode<T>*t);void Exchange(BTNode<T> *&t);void Level_traversal(void(*Visit)(T&x));BTNode<T>*root;protected:SeqQueue<T> s;private:void Clear(BTNode<T>* &t);void Level_traversal(void(*Visit)(T&x),BTNode<T>*t);};template<class T>void BinaryTree<T>::MakeTree(const T&x,BinaryTree<T>&left,BinaryTree<T>& right)   //建树{if(root || &left == &right) return;root = new BTNode<T>(x,left.root,right.root);left.root = right.root = NULL;}template<class T>bool BinaryTree<T>::Clear()   //删除{Clear(root);if(root == NULL)return true;elsereturn false;}template<class T>void BinaryTree<T>::Clear(BTNode<T>*& tmp)  //删除{if(tmp){Clear(tmp -> lChild);Clear(tmp -> rChild);delete tmp;tmp = NULL;}}template<class T>int BinaryTree<T>::High(BTNode<T>*p)  //高度{if(p == NULL)        return 0;else if(p -> lChild == NULL && p -> rChild == NULL)        return 1;else        return (High(p -> lChild) > High(p -> rChild) ? High(p -> lChild) + 1 : High(p -> rChild) + 1);}template<class T>int BinaryTree<T>::Node_num(BTNode<T>*p)   //叶子结点{if(p){if(p -> lChild == NULL && p -> rChild == NULL)    return 1;    elsereturn Node_num(p -> lChild) + Node_num(p -> rChild);}else        return 0;}template<class T>BTNode<T>*BinaryTree<T>::Copy(BTNode<T>*t)   //复制{if(!t) return NULL;BTNode<T>*q = new BTNode<T>(t -> element);q -> lChild = Copy(t -> lChild);q -> rChild = Copy(t -> rChild);return q;}template<class T>void BinaryTree<T>::Exchange(BTNode<T>*&t)    //左右子树交换{if(t){BTNode<T>*q = t -> lChild;t -> lChild = t->rChild;t -> rChild = q;Exchange(t -> lChild);Exchange(t -> rChild);}}template<class T>void BinaryTree<T>::Level_traversal(void(*Visit)(T&x))    //层次遍历{Level_traversal(Visit, root);cout << endl;}template<class T>void BinaryTree<T>::Level_traversal(void(*Visit)(T&x),BTNode<T>*t)   //层次遍历{BTNode<T> *a;Visit(t -> element);if(t -> lChild)s.EnQueue(t -> lChild);if(t -> rChild)s.EnQueue(t -> rChild);while(s.Front(a) == true){if(a -> lChild)    s.EnQueue(a -> lChild);    if(a -> rChild)    s.EnQueue(a -> rChild);Visit(a -> element);s.DeQueue();}}int main(){BinaryTree<char>t[100], a, b, temp;int num = 0, high = 0;t[7].MakeTree('H', a, b);t[8].MakeTree('I', a, b);t[3].MakeTree('D', t[7], t[8]);t[4].MakeTree('E', a, b);t[5].MakeTree('F', a, b);t[6].MakeTree('G', a, b);t[1].MakeTree('B', t[3], t[4]);t[2].MakeTree('C', t[5], t[6]);t[0].MakeTree('A', t[1], t[2]);cout << "二叉树z的层次遍历结果:\n";t[0].Level_traversal(Visit);temp.root = temp.Copy(t[0].root);cout<<"由二叉树z复制的二叉树temp的层次遍历结果:\n";temp.Level_traversal(Visit);t[0].Exchange(t[0].root);cout<<"交换左右子树后的二叉树z的层次遍历结果:\n";t[0].Level_traversal(Visit);num = t[0].Node_num(t[0].root);cout<<"二叉树z的叶子结点数为:\n"<< num << "\n";high = t[0].High(t[0].root);cout<<"二叉树z的高度为:\n" << high << "\n";cout<<"删除二叉树z: 成功输出1, 失败输出0\n" << t[0].Clear() << "\n";return 0;}




0 0
原创粉丝点击