数据结构探险——树篇

以下内容源于慕课网的学习整理,如有侵权,请告知删除。


树存在概念中,是对数组或者链表的一种操作方式的概念。


一、与树有关的一些基础概念

(1)树

  • 有限节点的集合;

(2)度

  • 某个节点的直接孩子数目;

(3)叶节点

  • 终端节点

(4)祖先

  • 所有在它之上的节点

(5)深度

  • 节点的深度(节点所处的位置)
  • 树的深度(整棵树的深度)

(6)二叉树

  • 所有节点的度都小于等于2

(7)二叉树的遍历

  • 前中后,是针对“根”来说的。

(8)作用实例

  • 人机对战


二、二叉树的数组实现

1、换算公式

  • 父节点下标*2+1,得到,父节点的左孩子节点的下标;
  • 父节点下标*2+2,得到,父节点的右孩子节点的下标

2、示意图

  • 括号里面表示的是索引,或者说节点序号,外面的是数据。
  • 慕课网中只是按照这个图,来进行查找(遍历查找)、插入(已经确定在哪个位置上出入了)、删除(删除后赋值为0)等操作。


三、二叉树的链表实现

1、节点要素

  • 数据,左孩子指针,右孩子指针,父指针,索引(这里用来表征节点的序号)

2、删除元素

  • 要求把对应的子节点也删除掉;
  • 也可能要求只删除该点,然后该点的孩子节点指向该点的父节点;

3、前序遍历(根左右)



4、中序遍历(左根右)

首先是左526,然后是根0,接着是右897;

然后对526进行同样的操作,即左是2,根是5,右是6,则排序结果是256;

同理对897进行同样的操作,即左是9,根是8,右是7,则排序结果是987;

最后合成为256 0 987。


5、后序遍历(左右根)

首先是左526,然后是右897,接着是根0;

然后对526进行同样的操作,即左是2,右是6,根是5,则排序结果是265;

同理对897进行同样的操作,即左是9,右是7,根是8,则排序结果是978;

最后合成为265  978 0。



6、编码实现

  • 树类、节点类;
  • 节点类包含五要素:数据,左孩子指针,右孩子指针,父指针,索引(这里用来表征节点的序号)
  • 前序遍历(中序遍历、后序遍历就调换相应的位置即可)。
  • 对树的遍历操作,落实在根节点调用遍历函数。

node.h

#ifndef  NODE_H
#define NODE_H
class Node{
public :Node();int index;int data;Node *pLNOde;Node *pRNode;Node *pParent;Node *SerchNode(int index);void deleteNode();void Preorder();void Midorder();void Postorder();
};
#endif

node.cpp

#include "Node.h"
#include <iostream>
using namespace std;Node::Node()
{index=0;data=0;pLNOde=NULL;pRNode=NULL;pParent=NULL;
};Node* Node::SerchNode(int index)
{Node *temp=NULL;if (this->index==index)return this;if (this->pLNOde!=NULL){	temp=this->pLNOde->SerchNode(index);if (temp!=NULL){return temp;}}if (this->pRNode!=NULL){temp=this->pRNode->SerchNode(index);if (temp!=NULL){return temp;}}return NULL;
};void Node::deleteNode()
{if(this->pLNOde!=NULL) {this->pLNOde->deleteNode();}if (this->pRNode!=NULL){this->pRNode->deleteNode();}if (this->pParent!=NULL){if (this->pParent->pLNOde==this){this->pParent->pLNOde=NULL;}if (this->pParent->pRNode==this){this->pParent->pRNode=NULL;}}delete this;
};void Node::Preorder()
{cout<<this->data<<" "<<this->index<<endl;if (this->pLNOde!=NULL){this->pLNOde->Preorder();}if (this->pRNode!=NULL){this->pRNode->Preorder();}
};void Node::Midorder()
{if (this->pLNOde!=NULL){this->pLNOde->Midorder();}cout<<this->data<<" "<<this->index<<endl;if (this->pRNode!=NULL){this->pRNode->Midorder();}
};void Node::Postorder()
{if (this->pLNOde!=NULL){this->pLNOde->Postorder();}if (this->pRNode!=NULL){this->pRNode->Postorder();}cout<<this->data<<" "<<this->index<<endl;
};


tree.h

#ifndef  Tree_H
#define Tree_H
#include "Node.h"class Tree
{
public:Tree();~Tree();Node *SerchNode(int index);//查找索引为index的那个节点,并返回指向该节点的指针bool addNode(int index,int direction,Node *node);//添加,在索引为index的节点上,添加一个节点node//左右方向由direction决定bool deleteNode(int index,Node *node);//删除void Preorder();//前序void Midorder();//中序void Postorder();//后序
private:Node *p_node;};#endif


tree.cpp

#include "Tree.h"
#include "Node.h"
#include <iostream>
using namespace std;Tree::Tree()
{p_node=new Node();
};Tree::~Tree()
{deleteNode(0,NULL);//这里调用的是tree中的删除节点函数,从根节点(0)开始
};Node *Tree::SerchNode(int index)
{return p_node->SerchNode(index);};bool Tree::deleteNode(int index,Node *node)
{Node *temp=SerchNode(index);if (temp!=NULL){if (node!=NULL)//传入的Node可以为null。是null时,表明不需要把要删除的节点的数据保存。{node->index=temp->index;node->data=temp->data;}temp->deleteNode();return true;}elsereturn false;
};bool Tree::addNode(int index,int direction,Node *node)
{Node *temp=SerchNode(index);if (temp){Node *NewNode=new Node();if (NewNode==NULL){return false;}NewNode->data=node->data;NewNode->index=node->index;if (direction==0){temp->pLNOde=NewNode;NewNode->pParent=temp;}if (direction==1){NewNode->pParent=temp;temp->pRNode=NewNode;}return true;}return false;
};void Tree::Preorder()
{p_node->Preorder();
}void Tree::Midorder()
{p_node->Midorder();
}void Tree::Postorder()
{p_node->Postorder();
}

test.cpp

#include "Node.h"
#include "Tree.h"
#include <iostream>using namespace std;
/*0(0)1(1)      2(2)5(3)  7(4)  6(5)   9(6)*/
int main()
{Tree *p=new Tree;//这里的p是指向根节点的指针Node *n2=new Node;n2->data=1;n2->index=1;Node *n3=new Node;n3->data=2;n3->index=2;Node *n4=new Node;n4->data=3;n4->index=3;Node *n5=new Node;n5->data=4;n5->index=4;Node *n6=new Node;n6->data=5;n6->index=5;Node *n7=new Node;n7->data=6;n7->index=6;Node *n8=new Node;n8->data=8;n8->index=8;Node *n9=new Node;n9->data=9;n9->index=9;	Node *n10=new Node;n10->data=10;n10->index=10;Node *n11=new Node;n11->data=11;n11->index=11;p->addNode(0,0,n2);p->addNode(0,1,n3);p->addNode(1,0,n4);p->addNode(1,1,n5);p->addNode(2,0,n6);p->addNode(2,1,n7);
//	p->addNode(4,0,n8);
//	p->addNode(4,1,n9);
//	p->addNode(6,0,n10);
//	p->addNode(6,1,n11);Node *n18=new Node;n18=p->SerchNode(10);if (n18!=NULL){cout<<"index:"<<n18->index<<endl;}//Node *n12=new Node;//p->deleteNode(6,n12);p->Preorder();cout<<"========================="<<endl;p->Postorder();cout<<"========================="<<endl;p->Midorder();delete p;p=NULL;system("pause");return 0;
}


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

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

相关文章

grub rescue的修复方法

2019独角兽企业重金招聘Python工程师标准>>> 在win7下删除了ubuntu的swap交换空间的分区&#xff08;大约6G左右&#xff0c;根据自己的实际分区情况决定&#xff09;。重新启动电脑进入界面&#xff0c;直接显示&#xff1a; error:unknow filesystemgrub rescue&g…

jmeter强大的扩展插件!!

jmeter4.0以上版本&#xff0c;如jmeter5.1.1版本的集成插件&#xff0c;只需要在官网下下载“plugins-manager.jar”包&#xff0c;放在jmeter安装路径的lib/ext目录下即可使用。&#xff08;但该jar包包含的插件&#xff0c;还不能满足所需的功能&#xff0c;如服务器系统资源…

数据结构探险——图篇

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 1、图的相关概念 2、图的存储结构 第一种是用数组表达&#xff0c;第二三种用链表来表示有向图&#xff0c;最后一种链表来表示无向图。&#xff08;1&#xff09;邻接矩阵&#xff08;有向无向都可…

jmeter+WebDriver:启动浏览器进行web自动化

无论是web自动化还是手机app自动化&#xff0c;WebDriver是Selenium的核心模块&#xff0c;jmeter WebDriver 仅支持Firefox、Chrome 和 HTML Unit驱动&#xff0c;暂不支持IE 驱动。 一、下载JMeterPlugins-WebDriver插件并配置分享我的网盘下载地址&#xff1a;https://pan.b…

LeetCode2——Add Two Numbers(两个链表中的数字相加,形成新链表)

鄙人不才&#xff0c;故收录LeetCode中的解法和代码。 题目&#xff1a; 参考解法&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { publi…

Linux基础(九)--定时任务

本文主要介绍了Linux中定时任务的相关知识。在日常中&#xff0c;有一些任务需要定时执行&#xff0c;例如&#xff1a;每天定时更新杀毒软件的数据库&#xff0c;每天定时执行数据清洗等脚本。这里就需要做定时任务。&#xff08;1&#xff09;概述在Linux中定时任务主要分为两…

【随感】tomorrow ,new semester ,finally i have time to read some books~

—————————youngLaker转载于:https://www.cnblogs.com/younglaker/archive/2012/12/30/2840129.html

LeetCode425——Add Strings(两个字符串中的数字相加(十进制或二进制),输出字符串形式的结果)

题目&#xff1a; 参考解法&#xff1a; class Solution { public:string addStrings(string num1, string num2) {if (num1.size() < num2.size()) return addStrings(num2, num1);//这里并不是递归&#xff0c;只是为了使得第一个参数的长度是最大的int carry 0, i num1…

yum只下载软件不安装的两种方法

2019独角兽企业重金招聘Python工程师标准>>> 今天来说下在CentOS下下载软件&#xff0c;不安装的方法&#xff1a; 方法一&#xff1a;通过yum自带一个工具&#xff1a;yumdownloader [rootweb1 ~]# rpm -qa |grep yum-utils [rootweb1 ~]# yum -y install yum-ut…

[转载] New Concept English 1——Lesson 7 Are you a teacher?

转载于:https://www.cnblogs.com/6DAN_HUST/archive/2012/12/31/2840653.html

LeetCode445——Add Two Numbers II(两个链表数据相加(从链表尾部开始),返回新链表)

题目&#xff1a; 参考解法&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l…

linux下制作codeblocks绿色版,并集成devhelp

Codeblocks更新到12.11了,可是软件中心还是10.01的.在codeblocks的官网找了一下发现了ubnutu的ppa, sudo apt-add-repository ppa:pasgui/ppa,可是不知道是否和以前的配置冲突,还是其它原因,编辑器居然没有多标签.于是想做一个绿色试试.到其wiki上以portable搜索 果然找到了方法…

appium+python自动化项目实战(二):项目工程结构

废话不多说&#xff0c;直接上图&#xff1a; nose.cfg配置文件里&#xff0c;可以指定执行的测试用例、生成测试报告等。以后将详细介绍。 转载于:https://www.cnblogs.com/luihengk/p/11414208.html

大数据批量插入小练习_SqlServer

这几天把sqlserver批量插入也整理了一下&#xff0c;性能方面有很大的提高&#xff0c;下面直接上代码using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.IO;using System.Threading;using Syste…

LeetCode371——Sum of Two Integers(不用+)

class Solution { public:int getSum(int a, int b) {int sum a;while (b ! 0){sum a ^ b;//calculate sum of a and b without thinking the carry b (a & b) << 1;//calculate the carrya sum;//add sum(without carry) and carry}return sum;} };

使用NSOperation为你的app加速

app store中的很多应用程序非常的笨重&#xff0c;他们有好的界面&#xff0c;但操作性很差&#xff0c;比如说当程序从网上或本地载入数据的时候&#xff0c;界面被冻结了&#xff0c;用户只能等程序完全载入数据之后才能进行操作。当打开一个应用程序时&#xff0c;iphone会产…

LeetCode43——Multiply Strings(两个字符串表示的整数相乘)???

题目&#xff1a; 参考解法&#xff1a; 法一&#xff1a; This is the standard manual multiplication algorithm. We use two nested for loops, working backward from the end of each input number. We pre-allocate our result and accumulate our partial result in …

Windows-server-2008-R2安装Oracle-11g-R2-dataguard

一、安装环境 1、服务器环境&#xff1a;Windows server 2008 R2 x64 Standard 两台 CPU&#xff1a;8核 内存&#xff1a;8G 硬盘空间&#xff1a;1060G 2、软件&#xff1a;oracle 11g R2 二、安装前配置 1、IP地址配置要求 主库IP&#xff1a;192.168.2.50 备库IP&#xff1…

LeetCode66——Plus One(一个整数用数组存储,然后在末尾加1)

题目&#xff1a; 参考解法&#xff1a; class Solution { public:vector<int> plusOne(vector<int>& digits) {bool carry true;for(int idigits.size()-1; i > 0 && carry; i--) {carry (digits[i]%10) 0;}if(carry) {digits.insert(digits.be…

项目中CI缓存适配器的使用

2019独角兽企业重金招聘Python工程师标准>>> 项目中CI缓存适配器的使用 项目中有若干控制器&#xff0c;这些控制器有一些公共数据&#xff0c;因此&#xff0c;在基控制器类中获取这些数据&#xff0c;为了提高系统性能&#xff0c;使用了缓存系统&#xff0c;采…