ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MFC二叉树绘制

2022-07-15 14:34:43  阅读:169  来源: 互联网

标签:Binary MFC CString Tree Btnode 二叉树 template 绘制


MFC二叉树绘制

二叉树问题:提供DEMO程序,已具备功能包括:按先序输入序列生成二叉树,输出二叉树先序、中序、后序遍历序列。
在此基础上完成如下任务:

  • (1) 实现二叉树的分层遍历,输出遍历序列。
  • (2) 对二叉树进行镜像操作。
  • (3) 绘制二叉树。
  • (4) 给出一个结点到另一个结点的最短路径。(选做)
    提交:程序源代码(含注释),程序报告文档,打包成压缩文件在课程网站上按规定时间提交。

补充说明:

  • 1.程序界面如下左,可以自己调整﹑美化或重新设计
  • 2.如下左图所示二叉树按层遍历序列为abcdegfhi
  • 3.如下左图所示二叉树的镜像为下右图
  • 4.如下左图所示二叉树e到h的最短路径为ebacgh

程序界面.png

功能实现

通过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);
	}
}


程序展现

二叉树绘制.gif

源码下载

链接:https://pan.baidu.com/s/1RLn7ES--SH5bgu1RlG7zFA
提取码:1111

标签:Binary,MFC,CString,Tree,Btnode,二叉树,template,绘制
来源: https://www.cnblogs.com/codewriter/p/16481249.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有