在二叉链表上实现二叉树运算
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;
else
return 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;
else
return 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;
}