文章中的二叉树原型为 《Data Structures, Algorithms, & Applications in C++》, 1nd Edition中的树类。
要求在源文件的基础上 实现以下三个操作:
【1】给出前序遍历和中序遍历结果,构造树。
【2】给出计算叶子节点数目的函数。
【3】交换树中的左右所有节点。
需要用到的主要函数(异常抛出\链表队列之类与主题没啥关系的请查书):
遍历查找函数:
BinaryTree<char> MakeTree2(string InOrder, string PreOrder)
{
BinaryTree<char> tree;
if(InOrder.empty()){
tree.root = 0;
return tree;
}
char RootValue;
RootValue = PreOrder[0];//根结点的值
//计算左右子树中结点数
size_t pos,LeftChildSize, RightChildSize;
pos = InOrder.find(RootValue);
LeftChildSize = pos;
RightChildSize = InOrder.size() - pos - 1;
string LeftInOrder, LeftPreOrder, RightInOrder, RightPreOrder;
//原函数不变
LeftInOrder = InOrder.substr(0, LeftChildSize);
RightInOrder = InOrder.substr(pos + 1, RightChildSize);
LeftPreOrder = PreOrder.substr(1,LeftChildSize+1);
RightPreOrder =PreOrder.substr(LeftChildSize+1,RightChildSize+1);
BinaryTree<char> left,right;
left = MakeTree2(LeftInOrder,LeftPreOrder);
right = MakeTree2(RightInOrder,RightPreOrder);
tree.root = new BinaryTreeNode<char>(RootValue);
tree.root->LeftChild = left.root;
tree.root->RightChild = right.root;
left.root = right.root = 0;
return tree;
}
BinaryTree.h
#include<iostream>
#include "LinkedQueue.h"
#include "binaryTreeNode.h"
#include "myexception.h"
#include <string>
#ifndef _BinaryTree
#define _BinaryTree
int _count;
template<class T>
class BinaryTree {
public:
BinaryTree() {root = 0;};
~BinaryTree(){};
bool IsEmpty() const
{return ((root) ? false : true);}
bool Root(T& x) const;
void MakeTree(const T& element,
BinaryTree<T>& left, BinaryTree<T>& right);
void BreakTree(T& element, BinaryTree<T>& left,
BinaryTree<T>& right);
void PreOrder(void(*Visit)(BinaryTreeNode<T> *u))
{PreOrder(Visit, root);}
void InOrder(void(*Visit)(BinaryTreeNode<T> *u))
{InOrder(Visit, root);}
void PostOrder(void(*Visit)(BinaryTreeNode<T> *u))
{PostOrder(Visit, root);}
void LevelOrder(void(*Visit)(BinaryTreeNode<T> *u));
void ExChange(BinaryTreeNode<T> *u);
void PreOutput() {PreOrder(Output, root); cout << endl;}
void InOutput() {InOrder(Output, root); cout << endl;}
void PostOutput() {PostOrder(Output, root); cout << endl;}
void LevelOutput() {LevelOrder(Output); cout << endl;}
void Delete() {PostOrder(Free, root); root = 0;}
int Height() const {return Height(root);}
int Size()
{_count = 0; PreOrder(Add1, root); return _count-1;}
//修改 叶子节点个数
int SizeLeaf(BinaryTreeNode<T> *root)
{
if(root==NULL)
return 0;
else if(root->LeftChild==NULL && root->RightChild==NULL)
return 1;
else
return SizeLeaf(root->LeftChild)+SizeLeaf(root->RightChild);
}
//自己添加的函数,P31--1
bool Compare(BinaryTreeNode<T> *X,BinaryTreeNode<T> *Y)
{
if(!Y && !X)
return true;
if((!(!Y && !X)) &&((!Y)||(!X)) || Y->data != X->data)
return false;
if(Compare(X->LeftChild, Y->LeftChild) && Compare(X->RightChild, Y->RightChild))
return true;
else
return false;
}
BinaryTreeNode<T> *root;
private:
void PreOrder(void(*Visit)
(BinaryTreeNode<T> *u), BinaryTreeNode<T> *t);
void InOrder(void(*Visit)
(BinaryTreeNode<T> *u), BinaryTreeNode<T> *t);
void PostOrder(void(*Visit)
(BinaryTreeNode<T> *u), BinaryTreeNode<T> *t);
static void Free(BinaryTreeNode<T> *t) {delete t;}
static void Output(BinaryTreeNode<T> *t)
{cout << t->data << ' ';}
static void Add1(BinaryTreeNode<T> *t) {_count++;}
int Height(BinaryTreeNode<T> *t) const;
};
template<class T>
bool BinaryTree<T>::Root(T& x) const
{
if (root) {x = root->data;
return true;}
else return false;
}
template<class T>
void BinaryTree<T>::MakeTree(const T& element,
BinaryTree<T>& left, BinaryTree<T>& right)
{
root = new BinaryTreeNode<T>
(element, left.root, right.root);
left.root = right.root = 0;
}
template<class T>
void BinaryTree<T>::BreakTree(T& element,
BinaryTree<T>& left, BinaryTree<T>& right)
{
if (!root) throw BadInput();
element = root->data;
left.root = root->LeftChild;
right.root = root->RightChild;
delete root;
root = 0;
}
//交换树的左右子节点.
template <class T>
void BinaryTree<T>::ExChange(BinaryTreeNode<T> *u)
{
BinaryTreeNode<T> *temp;
temp = root;
if(u)
{
temp=u->LeftChild;
(u)->LeftChild=(u)->RightChild;
(u)->RightChild=temp;
ExChange((*u).LeftChild);
ExChange((*u).RightChild);
}
}
template<class T>
void BinaryTree<T>::PreOrder(
void(*Visit)(BinaryTreeNode<T> *u),
BinaryTreeNode<T> *t)
{
if (t)
{
Visit(t);
PreOrder(Visit, t->LeftChild);
PreOrder(Visit, t->RightChild);
}
}
template <class T>
void BinaryTree<T>::InOrder(
void(*Visit)(BinaryTreeNode<T> *u),
BinaryTreeNode<T> *t)
{
if (t) {
InOrder(Visit, t->LeftChild);
Visit(t);
InOrder(Visit, t->RightChild);
}
}
template <class T>
void BinaryTree<T>::PostOrder(
void(*Visit)(BinaryTreeNode<T> *u),
BinaryTreeNode<T> *t)
{
if (t) {
PostOrder(Visit, t->LeftChild);
PostOrder(Visit, t->RightChild);
Visit(t);
}
}
template <class T>
void BinaryTree<T>::LevelOrder(
void(*Visit)(BinaryTreeNode<T> *u))
{
LinkedQueue<BinaryTreeNode<T>*> Q;
BinaryTreeNode<T> *t;
t = root;
while (t) {
Visit(t);
if (t->LeftChild) Q.Add(t->LeftChild);
if (t->RightChild) Q.Add(t->RightChild);
try {Q.Delete(t);}
catch (OutOfBounds) {return;}
}
}
template <class T>
int BinaryTree<T>::Height(BinaryTreeNode<T> *t) const
{
if (!t) return 0;
int hl = Height(t->LeftChild);
int hr = Height(t->RightChild);
if (hl > hr) return ++hl;
else return ++hr;
}
#endif
BinaryTreeNode.h,没改。。
#ifndef BinaryNode
#define BinaryNode
template <class T> class BinaryTree;
template <class T>
class BinaryTreeNode {
friend BinaryTree<T>;
public:
BinaryTreeNode() {LeftChild = RightChild = 0;}
BinaryTreeNode(const T& e)
{data = e; LeftChild = RightChild = 0;}
BinaryTreeNode(const T& e, BinaryTreeNode *l,
BinaryTreeNode *r)
{data = e; LeftChild = l; RightChild = r;}
T data;
BinaryTreeNode<T> *LeftChild,
*RightChild;
};
#endif
测试文件:
#include <iostream>
#include <string>
#include "BinaryTree.h"
#include "myexception.h"
#include "BinaryTreeNode.h"
using namespace std;
int count = 0;
BinaryTree<int> a,x,y,z,q,r,s;
int main()
{
y.MakeTree(3,a,a);
x.MakeTree(4,a,a);
z.MakeTree(5,y,x);
cout<<"交换前:";
z.PreOutput();
//交换测试
z.ExChange(z.root);
cout<<"交换后:";
z.PreOutput();
//个数测试
cout<<"叶子节点个数:"<<z.SizeLeaf(z.root)<<endl;
//声明一个变量
BinaryTree<char> p;
//qianxu="111",zhongxu="111";
/*string zhongxu="1234";
string qianxu="4321";*/
/*string zhongxu="312";
string qianxu="132";*/
string zhongxu="32145";
string qianxu="12345";
p=MakeTree2(zhongxu,qianxu);
cout<<"Add之后 前序的结果:";
p.PreOutput();
cout<<endl;
system("pause");
return 0;
}