递归法先序构造一棵二叉树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学了蛮久的数据结构了,看过很多的数据结构的书,讲到二叉树这一树结构类型的时候时,很多教材只说了遍历二叉树的方法,却没有讲怎么构造二叉树。
下面是我看过别人的二叉树的构造方法之后,自己又写的怎样构造一棵二叉树的方法。
采用线序的方法构造的,下面给出了现成的代码。
拿出来给大家分享一下。
(成功是站在别人的肩膀上)#include<iostream>
#include<string>
using namespace std;
template <typename T>//二叉树存储节点的定义
struct BiNode
{
T data;//节点的数据域
BiNode<T> * lchild;//二叉树的左节点
BiNode<T> * rchild;//二叉树的右节点
};
template <typename T>//二叉树的定义,用类实现
class BiTree
{
public:
BiTree()//构造函数,构造一棵二叉树
{
cout<<"请输入二叉树的节点信息,空的节点用#代替:"<<endl;
this->root = Create();
}
~BiTree()//析构函数,析构一颗二叉树
{
Release(root);//释放二叉树的节点内存
}
void PreOrd(BiNode<T> *root);//先序遍历二叉树
void InOrd(BiNode<T> *root);//中序遍历二叉树
void PostOrd(BiNode<T> *root);//后续遍历一颗二叉树
BiNode<T> * GetRoot();//获取根节点
private:
BiNode<T> * root;//根节点
BiNode<T> * Create();//递归构造一棵二叉树
void Release(BiNode<T> *root);//释放一棵二叉树的节点的内存};
//通过递归构造一棵二叉树
template <typename T>
BiNode<T> *BiTree<T>::Create()
{
BiNode<T> * root;//定义二叉树的节点
char ch;
cin>>ch;
if(ch == '#') root = NULL;//空节点
else
{
root = new BiNode<T>;//为节点分配内存空间
root->data = ch;//节点的数据域赋值
root->lchild = Create();//递归构造左子树
root->rchild = Create();//递归构造右子树
}
return root;
}
//返回指向根节点的指针
template <typename T>
BiNode<T> * BiTree<T>::GetRoot()
{
return this->root;
}
//释放二叉树的内存
template <typename T>
void BiTree<T>::Release(BiNode<T> * root)
{
if(root != NULL)
{
Release(root->lchild);//释放左子树的节点内存
Release(root->rchild);//释放右子树的节点内存
}
delete root;
}
//先序遍历二叉树
template <typename T>
void BiTree<T>::PreOrd(BiNode<T> *root)
{
if(root != NULL)//如果节点非空,则以先序递归遍历二叉树 {
cout<<root->data<<" ";//访问节点的数据
PreOrd(root->lchild);//递归遍历左子树
PreOrd(root->rchild);//递归遍历右子树
}
}
//中序遍历二叉树
template <typename T>
void BiTree<T>::InOrd(BiNode<T> *root)
{
if(root != NULL)//如果节点非空,则以中序递归遍历二叉树 {
InOrd(root->lchild);//递归遍历左子树
cout<<root->data<<" ";//访问节点的数据
InOrd(root->rchild);//递归遍历右子树
}
}
//后续遍历二叉树
template <typename T>
void BiTree<T>::PostOrd(BiNode<T> *root)
{
if(root != NULL)//如果节点非空,则以后序递归遍历二叉树 {
PostOrd(root->lchild);//递归遍历左子树
PostOrd(root->rchild);//递归遍历右子树
cout<<root->data<<" ";//访问节点的数据
}
}
int main(void)
{
BiTree<char> bitree;
BiNode<char> *root = bitree.GetRoot();
cout<<"先序遍历:"<<endl;
bitree.PreOrd(root);
cout<<endl;
cout<<"后续遍历;"<<endl;
bitree.PostOrd(root);
cout<<endl;
cout<<"中序遍历:"<<endl;
bitree.InOrd(root); cout<<endl;
return 0;
}
测试数据如下
输入:
abd#g##e##cfh##i###;先序遍历输出:
a b d g e c f h i
中序遍历输出:
d g b
e a h
f i c
后续遍历输出:
g d e b h i f c a
程序运行截图如下:。