⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trymovetree3_4view.cpp

📁 此程序是二叉树遍历单步动态演示
💻 CPP
字号:
// trymovetree3_4View.cpp : implementation of the CTrymovetree3_4View class
//
//Copyright:04本3班 赖删珊。

//此程序功能:在单文档中显示一个二叉树,并用动态演示它的遍历顺序

//作者:赖删珊。完成日期:2005年11月18日

//当前的版本号:LSS.04,该程序比LSS.03版本的多了菜单的选择功能,而且界面要好看一点,
//没有了红色画笔留下的痕迹,。另外,这里的flag是私有变量,而trymovetree3_2View.cpp
//里的flag是公有变量,功能是一样的。


#include "stdafx.h"
#include "trymovetree3_4.h"

#include "trymovetree3_4Doc.h"
#include "trymovetree3_4View.h"

#include <stack>

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

using namespace std;
typedef stack<int> STACK_INT;
STACK_INT stack1;


/////////////////////////////////////////////////////////////////////////////
// CTrymovetree3_4View

IMPLEMENT_DYNCREATE(CTrymovetree3_4View, CView)

BEGIN_MESSAGE_MAP(CTrymovetree3_4View, CView)
	//{{AFX_MSG_MAP(CTrymovetree3_4View)
	ON_COMMAND(ID_create, Oncreate)
	ON_COMMAND(ID_move, Onmove)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CTrymovetree3_4View construction/destruction

CTrymovetree3_4View::CTrymovetree3_4View()
{
	// TODO: add construction code here
	flag=0;
}

CTrymovetree3_4View::~CTrymovetree3_4View()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CTrymovetree3_4View drawing

void CTrymovetree3_4View::OnDraw(CDC* pDC)
{
	CTrymovetree3_4Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
    if(flag==1||flag==2)
	{
	//生成二叉树
	char CHAR[10]={' ','A','B','C','D',',','E','F',',','G'};  //此数组是按二叉树层次遍历排列的
	int length=10;           //传入数组长度
	int x,y;    //用来设置坐标的变化

	if(CHAR[1]!=',')
	{
		pDC->Ellipse(400,50,370,20);         //画第一个圆
		pDC->TextOut(380,25,CHAR[1]);        //输出圆里的字符
	}
	for (int i=1;i<length/2;i++)
	{
		if(i%2==0)                //若i为偶数,令x向左走
	    	x=370-45*(i/2);
		if(i%2==1)                //若i为奇数,令x向右走
	    	x=370+45*(i/2);

		y=20+45*(i/2);          //y无论是奇,偶都是向下走

		if(CHAR[2*i]!=',') //若CHAR[i]的左孩子存在,则画一向左倾斜的斜线和一个圆,并输出圆里的字符
		{
			pDC->MoveTo(x+4.4,y+25.6);          
			pDC->LineTo( x+4.4-30, y+25.6+30 );
			pDC->Ellipse( x-15,y+75,x-45,y+45);
			pDC->TextOut( x-35,y+50,CHAR[2*i] );
		}
		if(CHAR[2*i+1]!=',') //若CHAR[i]的右孩子存在,则画一向右倾斜的斜线和一个圆,并输出圆里的字符
		{
			pDC->MoveTo( x+25.6, y+25.6);
			pDC->LineTo( x+25.6+30, y+25.6+30);
			pDC->Ellipse(x+75,y+75,x+45,y+45);
			pDC->TextOut(x+45+10,y+45+5,CHAR[2*i+1]);
	}
	}
	}
	if(flag==2)
	{
	 //动态演示
	char CHAR[10]={' ','A','B','C','D',',','E','F',',','G'};
	int k=0;
	int length=10;  
	pDC->TextOut(170,200,"遍历顺序为:");

	CPen pen;          //创建画笔变量
	COLORREF oldbackcolor=pDC->GetBkColor();   //获取背景颜色

	char e;           //用来放从队列中POP出来的字符
	char a[7]={'A','B','D','G','C','E','F'};   //暂时代替队列
	int j;
	for(j=0;j<7;j++)
	{
		e=a[j];
		for(int i=1;i<length;i++)  //此for循环控制查找到e所对应的i的值
		{
			if(e==CHAR[i])     
			{   //根据i的值找到它所对应的坐标x,y的值

				int x=370;
				int y=35;
				while(i!=1)   //把从根走到i所经过的结点序号依次保存在栈里
				{
					stack1.push(i);
					i=i/2;
				}
				while(!stack1.empty())
				{
					i=stack1.top();
					stack1.pop();
					if(i==1) 
						continue;
					if(i%2==0)        //i为偶数,则x向左走
				    	x=x-45;
		           	if(i%2==1)        //i为奇数,则x向右走
					    x=x+45;
				    y=y+45;          //无论i为奇数或偶数,y都向下走
				}

				pDC->TextOut(270+k*20,200,CHAR[i]);   //输出所遍历到的字符
				k++;

				pen.CreatePen(PS_SOLID,2,RGB(255,0,0));  //把红色画笔设为当前的画笔
	            pDC->SelectObject(&pen);

         	    pDC->MoveTo(x,y);              //画箭头"--->"
				pDC->LineTo(x-30,y);
				pDC->MoveTo(x,y);
				pDC->LineTo(x-10,y-10);
				pDC->MoveTo(x,y);
				pDC->LineTo(x-10,y+10);

				pen.DeleteObject();           //释放画笔

				Sleep(1500);           //延时

				pen.CreatePen(PS_SOLID,2,oldbackcolor); //把背景颜色画笔设为当前的画笔画刷
				pDC->SelectObject(&pen);

				pDC->Rectangle(x+1,y+11,x-31,y-11);     //画一矩形把箭头覆盖住

				pen.DeleteObject();          //释放画笔

				i=length;        //控制跳出for循环
			}
		}
	}
	}
}

/////////////////////////////////////////////////////////////////////////////
// CTrymovetree3_4View printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CTrymovetree3_4View diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CTrymovetree3_4View message handlers

void CTrymovetree3_4View::Oncreate() 
{
	// TODO: Add your command handler code here
	flag=1;
	Invalidate(TRUE);
	
}

void CTrymovetree3_4View::Onmove() 
{
	// TODO: Add your command handler code here
	flag=2;
	Invalidate(TRUE);
	
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -