说明:使用Qt Creator完成 所以输入输出使用了Qt类。
二叉树的构建是按照前序顺序构建。
以字符#表示当前分支的递归结束
实现了前序、中序、后序遍历
提供了一些基本二叉树操作。
创建与删除结点交由BiTree统一管理,不提供对外接口
BiTree.h
struct BiNode
{
char data;
BiNode *Lnode,*Rnode;
};
class BiTree
{
public:
explicit BiTree();
~BiTree();
//二叉树遍历
void preOrder(BiNode *root);
void inOrder(BiNode *root);
void postOrder(BiNode *root);
//二叉树常用操作
BiNode *getRoot();
bool isEmpty();
char getValue(BiNode *node);
void setValue(BiNode *node,char val);
private:
BiNode *createBiTree();
void deleteBiTree(BiNode *root); //创建和删除节点全部交由BiTree统一管理,不提供对外的接口
BiNode *m_root=nullptr; //根节点指针。通过该指针可以实现二叉树内存释放 以及二叉树的遍历
};
BiTree.cpp
<span style="font-size:14px;">#include "bitree.h"
#include <QVector>
#include <QDebug>
BiTree::BiTree()
{
m_root=createBiTree();
}
BiTree::~BiTree()
{
deleteBiTree(m_root);
}
BiNode *BiTree::createBiTree()
{
QTextStream in(stdin);
char ch;
in>>ch;
BiNode *node;
if(ch=='#')
node=nullptr;
else
{
node=new BiNode;
node->data=ch;
qDebug()<<"输入左节点:";
node->Lnode=createBiTree();
qDebug()<<"输入右节点:";
node->Rnode=createBiTree();
}
return node;
}
BiNode *BiTree::getRoot()
{
return m_root;
}
void BiTree::deleteBiTree(BiNode *root)
{
if(!root)
return;
else
{
deleteBiTree(root->Lnode);
deleteBiTree(root->Rnode);
delete root;
root=nullptr;
}
}
void BiTree::preOrder(BiNode *root)
{
if(!root)
return;
qDebug()<<root->data<<" ";
preOrder(root->Lnode);
preOrder(root->Rnode);
}
void BiTree::inOrder(BiNode *root)
{
if(!root)
return;
inOrder(root->Lnode);
qDebug()<<root->data<<" ";
inOrder(root->Rnode);
}
void BiTree::postOrder(BiNode *root)
{
if(!root)
return;
postOrder(root->Lnode);
postOrder(root->Rnode);
qDebug()<<root->data<<" ";
}
bool BiTree::isEmpty()
{
if(m_root)
return 1;
else
return 0;
}
char BiTree::getValue(BiNode *node)
{
return node->data;
}
void BiTree::setValue(BiNode *node, char val)
{
node->data=val;
}</span><strong style="font-size: 18px;">
</strong>
main.cpp
#include <QCoreApplication>
#include <QDebug>
#include "bitree.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug()<<"Input character:";
BiTree biTree;
qDebug()<<"ProOrderTraerse:";
biTree.preOrder(biTree.getRoot());
qDebug()<<"InOrderTraerse:";
biTree.inOrder(biTree.getRoot());
qDebug()<<"PostOrderTraerse:";
biTree.postOrder(biTree.getRoot());
return a.exec();
}