二叉树MFC实现

news2024/10/6 16:45:06

设有一颗二叉树如下;

这似乎是一颗经常用作示例的二叉树;

对树进行遍历的结果是,

先序为:3、2、2、3、8、6、5、4,
中序为:2、2、3、3、4、5、6、8,
后序为2、3、2、4、5、6、8、3;

下面VC6看一下;单文档工程;

全部的视类CPP代码;

// btreeView.cpp : implementation of the CBtreeView class
//

#include "stdafx.h"
#include "btree.h"

#include "btreeDoc.h"
#include "btreeView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
};

void PreOrderTree(struct TreeNode*, CDC*, int);
void InOrderTree(struct TreeNode*, CDC*, int);
void PostOrderTree(struct TreeNode*, CDC*, int);
int maxDepth(struct TreeNode* );

int col = 0;

/
// CBtreeView

IMPLEMENT_DYNCREATE(CBtreeView, CView)

BEGIN_MESSAGE_MAP(CBtreeView, CView)
	//{{AFX_MSG_MAP(CBtreeView)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/
// CBtreeView construction/destruction

CBtreeView::CBtreeView()
{
	// TODO: add construction code here

}

CBtreeView::~CBtreeView()
{
}

BOOL CBtreeView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/
// CBtreeView drawing

void CBtreeView::OnDraw(CDC* pDC)
{
	CBtreeDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	CString str1;
	struct TreeNode nodea = { 3, NULL, NULL };
	struct TreeNode nodeb = { 2, NULL, NULL };
	struct TreeNode nodec = { 2, NULL, NULL };
	struct TreeNode noded = { 3, NULL, NULL };
	struct TreeNode nodee = { 8, NULL, NULL };
	struct TreeNode nodef = { 6, NULL, NULL };
	struct TreeNode nodeg = { 5, NULL, NULL };
	struct TreeNode nodeh = { 4, NULL, NULL };

	nodea.left = &nodeb;
	nodea.right = &nodee;
	nodeb.left = &nodec;
	nodeb.right = &noded;
	nodee.left = &nodef;
	nodef.left = &nodeg;
	nodeg.left = &nodeh;

	pDC->TextOut(20,30,"先序:");
	PreOrderTree(&nodea, pDC, 50);
	col=0;
	pDC->TextOut(20,80,"中序:");
	InOrderTree(&nodea, pDC, 100);
	col=0;
	pDC->TextOut(20,130,"后序:");
	PostOrderTree(&nodea, pDC, 150);

	int dp = maxDepth(&nodea);
	str1.Format("树的深度:%d", dp);
	pDC->TextOut(20,180,str1);
}

/
// CBtreeView printing

BOOL CBtreeView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CBtreeView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CBtreeView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/
// CBtreeView diagnostics

#ifdef _DEBUG
void CBtreeView::AssertValid() const
{
	CView::AssertValid();
}

void CBtreeView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CBtreeDoc* CBtreeView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBtreeDoc)));
	return (CBtreeDoc*)m_pDocument;
}
#endif //_DEBUG

/
// CBtreeView message handlers

void PreOrderTree(struct TreeNode* root, CDC* pDC, int rows) {
	CString str1;
	if (root == NULL) {
		return;
	}
	str1.Format("%d", root->val);
	pDC->TextOut(50+col*30, rows, str1);
	col=col+1;
	PreOrderTree(root->left,pDC,rows);
	PreOrderTree(root->right,pDC,rows);
}

void InOrderTree(struct TreeNode* root, CDC* pDC, int rows) {
	CString str1;
	if (root == NULL) {
		return;
	}
	InOrderTree(root->left, pDC, rows);
	str1.Format("%d", root->val);
	pDC->TextOut(50+col*30, rows, str1);
	col=col+1;
	InOrderTree(root->right, pDC, rows);
}

void PostOrderTree(struct TreeNode* root, CDC* pDC, int rows) {
	CString str1;
	if (root == NULL) {
		return;
	}
	PostOrderTree(root->left, pDC, rows);
	PostOrderTree(root->right, pDC, rows);
	str1.Format("%d", root->val);
	pDC->TextOut(50+col*30, rows, str1);
	col=col+1;
}

int maxDepth(struct TreeNode* root) {
	if (root == NULL) {
		return 0;
	}
	else {
		int maxLeft = maxDepth(root->left), maxRight = maxDepth(root->right);
		if (maxLeft > maxRight) {
			return 1 + maxLeft;
		}
		else {
			return 1 + maxRight;
		}
	}
}

struct TreeNode {...},这是树的节点,节点中存储一个整数;

void PreOrderTree(struct TreeNode*, CDC*, int); 先序遍历函数;
void InOrderTree(struct TreeNode*, CDC*, int);中序遍历函数;
void PostOrderTree(struct TreeNode*, CDC*, int);后序遍历函数;后2个参数是控制输出的;
int maxDepth(struct TreeNode* ); 求深度;

int col = 0; 控制输出的变量;

 一般控制台程序是按树输入节点来创建树;窗口的暂时不太好一行行输入节点,在代码中创建节点和节点关系;

运行如下;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1044633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes 学习总结(38)—— Kubernetes 与云原生的联系

一、什么是云原生? 伴随着云计算的浪潮,云原生概念也应运而生,而且火得一塌糊涂,大家经常说云原生,却很少有人告诉你到底什么是云原生,云原生可以理解为“云”“原生”,Cloud 可以理解为应用程…

深入浅出DAX:数据分析

深入浅出DAX:数据分析 01、区间分析 1. 数据区间分析 在Power BI中,选择“主页”→“输入数据”,创建“区间辅助表”,如图1所示。 ■ 图1 区间辅助表 创建度量值M.区间次数,表达式如下: M.区间次数 VA…

POJ 2991 Crane 线段树

一、题目大意 我们有一台起重机的机械臂,它由多个节相连组成,如下所示。 起初的时候,所有的节之间的角度都是180度,是竖直的,我们可以扭转其中任意两个节的角度,每一次移动后题目需要输出题目最后一个点相…

干货 | 工商业用户负荷分析与预测系统项目

以下内容整理自2023年夏季学期大数据能力提升项目《大数据实践课》同学们所做的期末答辩汇报。 我们将从六个方面进行展示。 第一部分是项目背景与需求分析。在“双碳”目标的大背景下,能源电力行业面临着深刻的变革,负荷预测作用也更加突出。虚拟电厂由…

蓝牙无线IP网络多功能多媒体音柱带遥控

SV-29810T-蓝牙无线IP网络多功能多媒体音柱带遥控 蓝牙无线IP网络多功能多媒体音柱SV-29810T产品用途: ◆室外室内豪华型防水音柱式一体化网络音频解码扬声器,用于广播分区音频解码、声音还原作用◆应用场地如火车站、地铁、教堂、工厂、仓库、公园停车…

lv5 嵌入式开发-7 有名管道和无名管道

目录 1 进程间通信介绍 2 无名管道 2.1 无名管道特点 ​编辑 2.2 读无名管道 2.3 写无名管道 3 有名管道 3.1 有名管道特点 3.2 写有名管道 3.3 读有名管道 掌握:进程间通信方式介绍、无名管道特点、无名管道创建、无名管道读写特性;有名管道…

【面试题】——JavaIO篇(23题)

文章目录 1.什么是Java IO?2.如何从数据传输方式理解IO流?3.Java IO设计上使用了什么设计模式?4.什么是Java NIO?5.什么时BIO?6.什么是AIO?7.你怎么理解同步IO和异步IO?8.你怎么理解阻塞IO和非阻塞IO?9.IO中的输入流和输出流有…

Python项目实战:多线程并行计算 + 多进程并行计算

文章目录 一、简介:【进程 多进程】 【线程 多线程】1.1、系统支持的CPU核心处理器1.2、核心处理器的参数解析:12th Gen Intel( R ) Core( TM ) i7-12700 2.10 GHz 二、函数详解2.0、计算CPU核心数:os.cpu_count() mp.cpu_count()2.1、用…

MongoDB 解析:灵活文档数据库与 Docker Compose 部署

MongoDB 是一款开源、高性能的 NoSQL 数据库,以其无模式的文档存储格式(BSON)而著称,广泛应用于众多开源项目,包括但不限于 Yapi 等。它在大规模数据存储和实时数据处理方面表现出色,因此备受青睐。在本文中…

C++学习——优先级队列模拟实现与仿函数初步认识

目录 ​编辑 一,优先级队列 二,实现 1.构造priority_queue类 2.简单的top()与size()还有empty()函数 3.push函数 4.pop函数 5.构造函数 6.测试 三,仿函数 1.介绍 2.使用 一,优先级队列 优先级队列——priority_queue。这…

【C++】gnustl_static 与 c++_shared 的区别

参考:GNU与cSTL的区别与联系-爱代码爱编程​ gnustl_static 与 c_shared 的区别: 不同版本的 STL TSL是一个与STL兼容的多线程支持库。 STLport是一个可移植、高度兼容的STL实现。 SGI STL是最早的STL实现之一,对STL的发展起到了重要的作用…

深入MySQL数据库进阶实战:性能优化、高可用性与安全性

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 MySQL是世界上最流行的开…

Windows 下 MySQL 8.1.0 安装及配置图文指南,快速搭建实验学习环境

目录 下载 MySQL安装 MySQL配置 MySQL修改密码配置环境变量 卸载 MySQL开源项目微服务商城项目前后端分离项目 下载 MySQL 访问 MySQL 下载地址:https://dev.mysql.com/downloads/mysql/ 下载 MySQL 时,你可以选择 ZIP 包或 MSI 安装: ZIP包…

赴日IT课程分享 如何尽快就职日本IT公司?

想要做赴日IT工作,我们先要搞清楚一个问题,那就是日本IT行业的缺口真的很大吗?答案是肯定的,对于有3-5年实际开发经验,能独立做开发,日语口语也好,不需要协助就能独立跟日本人交流的人&#xff…

DeepFace【部署 01】轻量级人脸识别和面部属性分析框架安装使用详解(网盘分享模型文件)

DeepFace安装使用 1.安装1.1 官方的三种方式1.2 使用的方式 2.使用2.1 模型文件下载2.2 Facial Recognition2.3 Face Verification2.4 Face recognition2.5 Embeddings2.6 Face recognition models2.7 Similarity2.8 Facial Attribute Analysis2.9 Face Detectors 3.总结 Githu…

知网G4期刊-基础教育论坛-如何投稿?

《基础教育论坛》知网 3版5000字符 24年上半年刊期,可收中小学基础教育,幼儿教育等教育全科文章。 《基础教育论坛》主要刊登有关教育教学理论探讨及课程改革、教学改革、考试改革研究等方面的文章,为广大基础教育工作者提供学术交流的…

Lua学习笔记:debug.sethook函数

前言 本篇在讲什么 使用Lua的debug.setHook函数 本篇需要什么 对Lua语法有简单认知 依赖Sublime Text工具 本篇的特色 具有全流程的图文教学 重实践,轻理论,快速上手 提供全流程的源码内容 ★提高阅读体验★ 👉 ♠ 一级标题 &…

第五章:C语言的数组

文章目录 1、数组的理解2、各类数组的定义3、变长数组4、字符数组 1、数组的理解 一维数组:比如定义一个int a[3];,那么可以将其看成两部分,a【3】为①,int为②。意思就是有一个数组名字为a,里面包含3个(池&#xff0…

QT5自定义下拉框为QTreeView类型(树形分上下级)的下拉框(QComboBox)(超详细步骤)

项目开发中,很可能简单的QComboBox满足不了需求,就需要自定义QComboBox。 先看效果。 自定义ComboBox 1、先建立一个project,命名为CustomComboBox,建立一个project的过程不细说了。建立后的工程目录如下图: 2、在项目名CustomCo…

React 全栈体系(十六)

第八章 React 扩展 五、Context 1. 代码 /* index.jsx */ import React, { Component } from react import ./index.css//创建Context对象 const MyContext React.createContext() const {Provider,Consumer} MyContext export default class A extends Component {state …