1
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

195 lines
5.8 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <fstream>
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
#include "Bitree.h"
#include "SeqStack.h"
template <class T>
BinTreeNode<T> *MakeTreeNode(const T item, BinTreeNode<T> *left = NULL, BinTreeNode<T> *right = NULL)
//由结点构造二叉树
{
BinTreeNode<T> *p;
p = new BinTreeNode<T>(item, left, right);
return p;
}
BinTreeNode<char> *MakeCharTree()
//创建不带头结点的二叉链表
{
BinTreeNode<char> *b, *c, *d, *e, *f, *g, *null = NULL, *root;
g = MakeTreeNode('G');
d = MakeTreeNode('D', null, g);
b = MakeTreeNode('B', d);
e = MakeTreeNode('E');
f = MakeTreeNode('F');
c = MakeTreeNode('C', e, f);
root = MakeTreeNode('A', b, c);
return root;
}
//已知二叉树的前序遍历序列preS和中序遍历序列inS采用递归算法构造二叉树。
template <class T>
BinTreeNode<T> *createBinaryTree(T *VLR, T *LVR, int n)
{
if (n == 0) return NULL;
int k = 0;
while (VLR[0] != LVR[k]) k++;
BinTreeNode<T> *t = new BinTreeNode<T>(VLR[0]);
t->leftChild = createBinaryTree(VLR + 1, LVR, k);
t->rightChild = createBinaryTree(VLR + k + 1, LVR + k + 1, n - k - 1);
return t;
}
template <class T>
void visit(BinTreeNode<T> *p)
{
cout << p->data << " ";
}
int main()
{
//构造二叉树1:前序遍历建立二叉树,从文件输入前序遍历序列使用0表示空
ifstream fin("data.txt");
assert(fin);
BinaryTree<int> binTree(0); //输入序列中使用0表示空
assert(fin >> binTree); //前序遍历建立二叉树
fin.close();
cout << "\nThe binary tree is: \n"
<< binTree << endl; //输出1前序遍历输出二叉树到屏幕
PrintBTree(binTree.getRoot()); //输出2以广义表形式输出二叉树到屏幕
ofstream fout("output.txt");
assert(fout);
assert(fout << binTree); //输出3前序遍历输出二叉树到文件
fout.close();
BinaryTree<int> binTree1(binTree); //复制构造
cout << "\n\nThe copy binary tree is: \n"
<< binTree1 << endl;
PrintBTree(binTree1.getRoot());
if (binTree == binTree1) //判相等
cout << "\n\nThe two binary is equal. ";
else
cout << "\n\nThe two binary is not equal. ";
//构造二叉树2:从广义表输入,前序遍历建立二叉树
//binTree.CreateBinTree(cin,Tree.getRoot());
//计算二叉树的高度
cout << "\n\n二叉树高度等于" << binTree.Height() << endl;
//测试-非递归算法计算二叉树的深度
if (binTree.NonR_Height() != binTree.Height())
cout << "\n\nERROR:二叉树高度应该等于" << binTree.Height();
//计算二叉树的结点个数
cout << "\n二叉树结点个数等于" << binTree.Size() << endl;
//二叉树的遍历
cout << "\n前序遍历结点次序为: ";
binTree.preOrder(visit);
cout << "\n中序遍历结点次序为: ";
binTree.inOrder(visit);
cout << "\n后序遍历结点次序为: ";
binTree.postOrder(visit);
//测试-判断平衡: 判断二叉树是否为平衡二叉树
bool IsbTree = binTree.IsBalanced();
if (IsbTree == true)
cout << endl
<< "\n\n二叉树为平衡二叉树!" << endl;
else
cout << "\n\n二叉树为非平衡二叉树!" << endl;
//构造二叉树3根据前序遍历preS和中序遍历inS创建二叉树
char *preS, *inS;
preS = "ABDGCEF";
inS = "DBGAECF";
BinaryTree<char> *Tree = new BinaryTree<char>('^');
Tree->setRoot(createBinaryTree<char>(preS, inS, 7)); //前序建立二叉树方法2
cout << endl;
//Tree->PrintBTree(test->getRoot(),0);
cout << "\nThe binary tree is: \n";
PrintBTree(Tree->getRoot());
//测试-判断平衡: 判断二叉树是否为平衡二叉树
IsbTree = Tree->IsBalanced();
if (IsbTree == true)
cout << endl
<< "\n二叉树为平衡二叉树!" << endl;
else
cout << endl
<< "\n二叉树为非平衡二叉树!" << endl;
cout << endl;
//测试-非递归算法计算二叉树的深度
if (Tree->NonR_Height() != Tree->Height())
cout << "\nERROR:二叉树高度应该等于" << Tree->Height();
else
cout << endl
<< "二叉树高度等于" << Tree->Height();
//二叉树的非递归遍历
cout << "\n非递归前序遍历结点次序1为: ";
Tree->NonR_preOrder(visit);
cout << "\n非递归前序遍历结点次序2为: ";
Tree->NonR_preOrder1(visit);
cout << "\n非递归中序遍历结点次序为: ";
Tree->NonR_inOrder(visit);
cout << "\n非递归后序遍历结点次序为: ";
Tree->NonR_postOrder(visit);
cout << endl;
//测试-构造二叉树
BinaryTree<char> Test('#');
BinTreeNode<char> *p;
//Test.setRoot(MakeCharTree());
p = Test.Insert(Test.getRoot(), 'A', 0);
p = Test.Insert(p, 'B', 0);
p = Test.Insert(p, 'D', 0);
p = Test.Insert(p, 'G', 1);
p = Test.Insert(Test.getRoot(), 'C', 1);
Test.Insert(p, 'E', 0);
Test.Insert(p, 'F', 1);
cout << "\nThe binary tree is: \n";
PrintBTree(Test.getRoot(), 0); //以凹入表形式输出二叉树
//二叉树的非递归遍历
cout << "\n非递归前序遍历结点次序为: ";
Test.NonR_preOrder(visit);
cout << "\n非递归中序遍历结点次序为: ";
Test.NonR_inOrder(visit);
cout << "\n非递归后序遍历结点次序为: ";
Test.NonR_postOrder(visit);
cout << endl;
//测试-判断平衡: 判断二叉树是否为平衡二叉树
IsbTree = Test.IsBalanced();
if (IsbTree == true)
cout << endl
<< "\n\n二叉树为平衡二叉树!" << endl;
else
cout << "\n\n二叉树为非平衡二叉树!" << endl;
cout << endl;
//测试-查找
cout << "G的双亲是" << Test.Parent(Test.Find('G'))->data << endl;
cout << "D的双亲是" << Test.Parent(Test.Find('D'))->data << endl;
cout << "B的双亲是" << Test.Parent(Test.Find('B'))->data << endl;
cout << "E的双亲是" << Test.Parent(Test.Find('E'))->data << endl;
cout << "F的双亲是" << Test.Parent(Test.Find('F'))->data << endl;
cout << "C的双亲是" << Test.Parent(Test.Find('C'))->data << endl;
//测试-非递归算法计算二叉树的深度
if (Test.NonR_Height() != Test.Height())
cout << "\nERROR:二叉树高度应该等于" << Test.Height();
else
cout << endl
<< "二叉树高度等于" << Test.Height();
system("pause");
}