MFC二叉树绘制
作者:互联网
MFC二叉树绘制
二叉树问题:提供DEMO程序,已具备功能包括:按先序输入序列生成二叉树,输出二叉树先序、中序、后序遍历序列。
在此基础上完成如下任务:
- (1) 实现二叉树的分层遍历,输出遍历序列。
- (2) 对二叉树进行镜像操作。
- (3) 绘制二叉树。
- (4) 给出一个结点到另一个结点的最短路径。(选做)
提交:程序源代码(含注释),程序报告文档,打包成压缩文件在课程网站上按规定时间提交。
补充说明:
- 1.程序界面如下左,可以自己调整﹑美化或重新设计
- 2.如下左图所示二叉树按层遍历序列为abcdegfhi
- 3.如下左图所示二叉树的镜像为下右图
- 4.如下左图所示二叉树e到h的最短路径为ebacgh
功能实现
通过MFC,实现对二叉树节点的绘制,并能进行镜像操作,深度优先遍历DFS(前序、中序、后序)和广度优先搜索BFS(按层遍历),查找两节点之间的最短路径(找共同祖先)。
部分源代码
#pragma once
#include "stdafx.h"
#include <queue>
using namespace std;
#ifdef _HEHE
//该宏定义用于判断T类型
template<class T>
struct TypeParseTraits;
#define REGISTER_PARSE_TYPE(X) template <> struct TypeParseTraits<X> \
{ static const char* name; } ; const char* TypeParseTraits<X>::name = #X
REGISTER_PARSE_TYPE(int);
REGISTER_PARSE_TYPE(float);
REGISTER_PARSE_TYPE(double);
REGISTER_PARSE_TYPE(char);
REGISTER_PARSE_TYPE(TCHAR);
#endif
//二叉树结点
template <class T>
struct Btnode
{
T d;
Btnode *lchild;
Btnode *rchild;
};
//二叉树类
template <class T>
class Binary_Tree
{
private:
Btnode<T> *BT; //根
CString Sequence; //遍历序列
public:
Binary_Tree() //构造函数,初始化
{
BT=NULL;
return;
}
void creat_Binary_Tree(T*, T); //生成树
CString pretrav_Binary_Tree(); //先序遍历
CString intrav_Binary_Tree(); //中序遍历
CString postrav_Binary_Tree(); //后序遍历
};
//输出结点内容
template <class T>
static CString output(T a)
{
CString s;
char* name= (char*)TypeParseTraits<T>::name;
if(strcmp(name, "int")==0)
{
s.Format(L"%d", a);
}
else if(strcmp(name, "double")==0 ||strcmp(name, "float")==0)
{
s.Format(L"%f", a);
}
else if(strcmp(name, "char")==0 || strcmp(name, "TCHAR")==0)
{
s.Format(L"%c", a);
}
return s;
}
//生成树
template <class T>
void Binary_Tree<T>::creat_Binary_Tree(T* nodes, T end)
{
if(nodes==NULL) return;
Btnode<T> *p;
T* tmpnodes=nodes;
T x=tmpnodes[0];
if(x==end) return;
p=new Btnode<T>;
p->d=x;
p->lchild=NULL;
p->rchild=NULL;
BT=p;
creat(p, tmpnodes, 1, end);
creat(p, tmpnodes, 2, end);
}
template <class T>
static void creat(Btnode<T>*p, T*& nodes, int k, T end)
{
nodes++;
Btnode<T> *q;
T x=nodes[0];
if(x!=end)
{
q=new Btnode<T>;
q->d=x;
q->lchild=NULL;
q->rchild=NULL;
if(k==1) p->lchild=q;
if(k==2) p->rchild=q;
creat(q, nodes, 1, end);
creat(q, nodes, 2, end);
}
}
//先序遍历
template <class T>
CString Binary_Tree<T>::pretrav_Binary_Tree()
{
Btnode<T>*p;
p=BT;
Sequence="";
pretrav(p, Sequence);
return Sequence;
}
template <class T>
static void pretrav(Btnode<T> *p, CString & s0)
{
if(p!=NULL)
{
s0 +=output(p->d);
pretrav(p->lchild, s0);
pretrav(p->rchild, s0);
}
}
//中序遍历
template <class T>
CString Binary_Tree<T>::intrav_Binary_Tree()
{
Btnode<T>*p;
p=BT;
Sequence="";
intrav(p, Sequence);
return Sequence;
}
template <class T>
static void intrav(Btnode<T> *p, CString & s0)
{
if(p!=NULL)
{
intrav(p->lchild, s0);
s0 +=output(p->d);
intrav(p->rchild, s0);
}
}
//后序遍历
template <class T>
CString Binary_Tree<T>::postrav_Binary_Tree()
{
Btnode<T>*p;
p=BT;
Sequence="";
postrav(p, Sequence);
return Sequence;
}
template <class T>
static void postrav(Btnode<T> *p, CString & s0)
{
if(p!=NULL)
{
postrav(p->lchild, s0);
postrav(p->rchild, s0);
s0 +=output(p->d);
}
}
程序展现
源码下载
链接:https://pan.baidu.com/s/1RLn7ES--SH5bgu1RlG7zFA
提取码:1111
标签:Binary,MFC,CString,Tree,Btnode,二叉树,template,绘制 来源: https://www.cnblogs.com/codewriter/p/16481249.html