1.二叉树创建的3种方法 在嵌套法创建二叉树的过程中,递归终止条件是十分重要设置的一环。节点数据是char类型的二叉树,嵌套创建时,很多人会用一个字符,比如输入流中的“ ”(空)来设置递归结束。倘若节点数据为int类型,则稍微复杂, 首先我们在输入时必须
1.二叉树创建的3种方法
在嵌套法创建二叉树的过程中,递归终止条件是十分重要设置的一环。节点数据是char类型的二叉树,嵌套创建时,很多人会用一个字符,比如输入流中的“ ”(空格)来设置递归结束。倘若节点数据为int类型,则稍微复杂,首先我们在输入时必须使用“空格,制表,换行”这3者之一间隔输入的数,且cin读取数据时候cin会跳过三种空格,因此有的人使用某个数比如“0, -1”设置递归终止,但是要求某个节点的数值就是递归终止判断条件所设置的值比如‘-1’呢,显然这不符合程序的完整性。基于此,本文提供了一种思路。
这里,我们总结了3种二叉树创建方法。约定,二叉树节点定义如下:
typedef struct BinaryTreeNode { int data; BinaryTreeNode * leftchild; BinaryTreeNode * rightchild; }Node,*NodePoint;
意图构建成的二叉树如下图所示:
第一种方法:不带参数的二叉树构建
Node *Create()//二叉树的创建,不带参数 { Node *root; if(cin.peek()=='#') {cin.get();return NULL;} else {root = new Node; cin>>root->data;//前序创建。 root->leftchild= Create(); root->rightchild= Create(); return root; } }可以观察到,返回为节点指针类型。
第二种方法:带一个参数的二叉树创建
void Create(NodePoint* root)//带一个参数的二叉树创建,注意形参为指针的引用或者双重指针 { if(cin.peek()=='#') {cin.get();*root=NULL;} else {*root = new Node; cin>>(*root)->data;//前序创建 Create(&(*root)->leftchild); Create(&(*root)->rightchild); } }
可以观察到,形参为指向节点指针的指针的指针,即双重指针。如上所示,递归和赋值写法稍显不同。
总结方法一,方法二的递归终止条件。使用cin.peek()检查输入流下一个字符是否为“#”,cin.peek()只检查输入流并不抽取删掉。倘若是,结束递归,并使用cin.get()将“#”从输入流抽取并删掉。使用如下代码建立如上图所示的目标二叉树时:
NodePoint Root=NULL; Root=Create();//不带参数构建 Create(&Root);//带一个参数构建,此处形参为双重指针输入为:“35 13 0##-15#19##-7##”。当然,两种方法均需要使用前序遍历创建。‘#’控制递归截止,“ ”代表间隔int数据。这两种方法只适合前序创建。
第三种方法:两个形参的二叉树创建函数
void Create( NodePoint &root , int data ) { Node *p = new Node; p->data=data;p->leftchild=0;p->rightchild=0; if(!root) root=p; else if( p->data<root->data ) Create(root->leftchild,p->data ); else Create(root->rightchild,p->data ); }</root->调用如下:
while(data <p> <span> 可以观察到。第一个形参为指针引用,输入参数和赋值参数与第二种方法的形参为双重指针不同。其次,二叉树满足”降顺序二叉数装入数据,满足左<root></root></span></p> <h1 id="span-span-strong-二叉树的递归遍历-strong-span-span"><span><span><strong>2.二叉树的递归遍历</strong></span></span></h1> <p></p> <pre class="brush:php;toolbar:false">void PreTraverse(NodePoint Root)//嵌套前序遍历 { if(Root) {coutdataleftchild); PreTraverse(Root->rightchild);} } void MidTraverse(NodePoint Root)//嵌套中序遍历 { if(Root) {MidTraverse(Root->leftchild); coutdatarightchild);} } void PostTraverse(Node* Root)//嵌套后序遍历 { if (Root ) {PostTraverse(Root->leftchild); PostTraverse(Root->rightchild); cout data<br> <h1> <span><span><span>3.二叉树销毁 </span></span> </span> </h1> <pre class="brush:php;toolbar:false">template<class t> void destroy(TreeNode<t> *& p) //传递指针的引用,消毁函数,用来消毁二叉树中的各个结点 { if(p) { //错误 return之后 没有执行delete p //return destroy(p->Lchild); //return destroy(p->Rchild); destroy(p->Lchild); destroy(p->Rchild); //delete只能释放由用户通过new方式在堆中申请的内存, //是通过变量声明的方式由系统所声明的栈内存不能使用delete删除 //delete和free函数一样,不修改它参数对应指针指向的内容,也不修改指针本身, //只是在堆内存管理结构中将指针指向的内容标记为可被重新分配 delete p; //堆上内存释放 栈上指针并不销毁 //此时p指向的地址未知,此时执行*p = ? 操作会导致不可预料的错误 //但是可以重新赋值p = &x; //最好delete之后把P置空 p = NULL; } }</t></class>
<span> <span>容易混淆的错误声明:void destroy(TreeNode<t>* p) 这种声明会创建一个局部的临时对象来保存传递的指针。</t></span></span><span><span>虽然2个指针都执行同一块堆空间,delete局部指针 也会删除二叉树结构所占用的堆内存,</span><span>但全局传递的那个指针将会是垃圾指针,会产生不可预料的错误。</span><span>void destroy(TreeNode<t> *& p) 此函数的参数为全局指针的一个别名,代表全局指针rootNode本身。</t></span><span>这样p = NULL;能达到置空指针的目的。</span></span>
本文有参考自:
C++ 二叉树的实现以及指针使用注意事项
二叉树常用算法总结

您的PC有时会遇到问题,导致难以正常启动。在这种情况下,您可以使用Windows11恢复USB恢复它。虽然这一切看起来简单明了,但您仍然需要知道如何创建和使用恢复USB。在本指南中,我们将引导您完成轻松执行此任务所需的步骤。我可以下载Windows11恢复USB吗?如果您的操作系统完全崩溃,您可以从另一台运行良好的PC下载Windows11恢复USB。但是,要从中创建恢复驱动器的电脑必须与你的电脑具有相同的体系结构。最好的选择仍然是在PC正常运行时从PC创建USB。这消除了任何兼容性风险。或者,

win11怎么创建本地连接?有小伙伴在升级到win11系统之后,发现一些功能没办法正常使用,有小伙伴使用本地连接得时候,发现没有办法正常连接,不能正常连接的话,就没有办法上网,那么我们应该如何解决呢。小编下面整理了win11创建本地连接步骤,感兴趣的话,跟着小编一起往下看看吧!win11创建本地连接步骤1、点击桌面开始菜单,打开设置面板,如图所示。2、找到网络和Internet选项,如图所示。3、点击设置拨号连接按钮,如图所示。4、点击该栏目下的设置新连接选项,如图所示。5、最后点击设置新网络图

Win11如何创建电源计划?电源计划是管理计算机如何使用和节省电源的硬件和系统设置的集合。近期有用户在问Win11如何创建电源计划?其实方法很简单,还不清楚应该如何操作的朋友们可以来看看下面这篇Win11自定义电源计划的技巧,希望你会喜欢。 Win11自定义电源计划的技巧 在Windows11上创建自定义电源计划 打开开始菜单并键入控制面板。 从搜索结果中选择控制面板。 在控制面板中,将查看方式选项更改为大图标。 接下来,选择电源选项。 单击电源选项菜单中的创建电源计划选项。

假设您有一个要求,您必须从50个人那里收集数据。您可以将Word文件发送给他们,他们可以轻松填写。但是您需要所有50个文档中的格式和对齐方式以及其他所有内容都相同。好吧,如果您将原始Word文件提供给这50个人,而不是50个相同的文档,您将得到50个完全不同的文档,不用说。那么,有解决办法吗?当然,您知道我们总有适合您的解决方案!让我们谈谈模板!Word模板是您的任务的完美解决方案。通过使用Word模板,您可以在用户打开模板文档时提示他们输入一些数据。他们可以在用户提

随着互联网的普及以及人们对电影的热爱,电影网站成为了一个受欢迎的网站类型。在创建一个电影网站时,一个好的框架是非常必要的。Yii框架是一个高性能的PHP框架,易于使用且具有出色的性能。在本文中,我们将探讨如何使用Yii框架创建一个电影网站。安装Yii框架在使用Yii框架之前,需要先安装框架。安装Yii框架非常简单,只需要在终端执行以下命令:composer

MySQL表设计教程:创建一个简单的留言板表介绍在网站开发中,留言板是一个非常常见的功能,用于让用户在网站上发表评论、建立联系等。在设计留言板功能时,一个重要的步骤是创建适当的数据表来存储留言的信息。本文将教你如何使用MySQL来创建一个简单的留言板表。步骤一:创建数据库首先,我们需要创建一个数据库来存储留言板的数据。可以使用以下代码创建数据库:CREATE

MySQL表设计教程:创建一个简单的用户积分表标题:MySQL表设计教程:创建一个简单的用户积分表导语:在开发常见的用户系统中,积分系统是一个重要的组成部分。本文将教你如何使用MySQL创建一个简单的用户积分表,并附带代码示例,帮助你更好地理解和实践该表设计。正文:确定表的名称和字段首先,我们需要确定表的名称和表中所需的字段。对于用户积分表,我们可以将其命名

MySQL表设计教程:创建一个简单的新闻表在开发网站或应用程序时,新闻表是一个常见的数据库表之一。它用于存储和管理新闻文章的相关信息,如标题、内容、作者、发布日期等。本文将介绍如何使用MySQL创建一个简单的新闻表,并给出相应的代码示例。首先,我们需要创建一个数据库来存储新闻表。可以使用以下代码来创建一个名为"news_db"的数据库:CREATEDATA


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Dreamweaver Mac version
Visual web development tools

MantisBT
Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

Notepad++7.3.1
Easy-to-use and free code editor

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.

SublimeText3 Mac version
God-level code editing software (SublimeText3)
