导航:首页 > 程序命令 > 程序员的二叉树舞蹈

程序员的二叉树舞蹈

发布时间:2022-07-26 05:03:30

⑴ 请问这是什么植物开玩笑说这是程序猿的二叉树,但是我想知道这种植物的真实的名字是什么

已经有高手回答过此问题,不想复制别人现成的成果。请参考:

⑵ 支持子程序调用的数据结构是什么 栈树队列二叉树

额 理论上来说所有数据结构都支持子程序的调用。。。这个题的意思应该是子程序调用的时候能看成什么样的数据结构。
严格来说是栈——因为递归调用子程序的时候就是先入后出的而且是线性的。虽然子程序也可以这样调用
f[i]=f[i-1]+f[i-1]
看起来像是树,但是实际上还是深度优先遍历一棵树,本质上是个栈。
所以说这个题的题意不清。如果说“能够使用子程序调用的数据结构”就是全选,如果是“子程序调用的时候能看成什么样的数据结构“就是栈。

⑶ 二叉树的应用

一个单位有10个部门,每个部门都有一部电话,但是整个单位只有一根外线,当有电话打过来的时候,由转接员转到内线电话,已知各部门使用外线电话的频率为(次/天)
5 20 10 12 8 4 3 5 6 9
问应该如何设计个内线电话号码,使得接线员拨号次数尽可能少?

这是哈夫曼树的应用

⑷ 用VB编写 二叉树的建立与遍历、二叉树的排序

实验四 二叉树的建立和遍历
一、 实验名称
二叉树的建立和遍历。
二、实验目的
掌握二叉树的二叉链表存储结构及二叉树的建立方法。熟悉二叉树的遍历方法。
三、实验内容
(1) 根据先序遍历和中序遍历的序列,建立一棵二叉树(二叉树用二叉链表存储)。
(2) 分别以先序和中序遍历二叉树,将假设结果与给定的先序和中序遍历序列进行比较,以证明建立二叉树的正确性。
(3)给出后序遍历序列。
四、实验步骤
(1)编写一个过程,将给出的遍历序列读入一个数组;
(2)编写一个过程,根据先序和中序遍历的序列建立一棵二叉树;
(3)编写一个过程,进行先序遍历,并将结果存入一个数组。
(4)编写一个过程,进行中序遍历,并将结果存入一个数组。
(5) 编写一个函数,用以证明建立的二叉树的正确性。
(6)编写一个过程,进行后序遍历,打印后序遍历结果(前面函数为真时);
(7)调试程序:
先序遍历序列为:ABDECF;中序遍历序列为:DBEACF;
(8)将实验心得写在程序后面,作为实验报告进行文档备份。
五、实验数据处理
将原程序和实验结果存入计算机室服务器或软盘后,交由指导老师或有关实验人员保存。

实验五 二叉树的排序
一、 实验名称
二叉树的排序。
二、实验目的
通过该实验,进一步熟悉二叉树的建立方法,掌握二叉排序树的建立和使用。
三、实验内容
(1)根据中序遍历,建立一棵二叉排序树用二叉链表存储;
(2)给出先序遍历和后序遍历序列。
四、实验步骤
(1)编写一个过程,将给定的待排序数据读入一个数组;
(2)编写一个过程,建立二叉排序树;
(3)编写一个函数,用中序遍历以证明二叉排序树的正确性;
(4)编写一个过程,进行先序遍历,并打印遍历结果(第3步必须确保正确);
(5)编写一个过程,进行后序遍历,并打印遍历结果(第3步必须确保正确);
(6)调试程序;
用以下数据调试程序:(58、48、77、42、64)
(7)将实验心得写在程序后面,作为实验报告进行文档备份。
五、实验数据处理
将原程序和实验结果存入计算机室服务器或软盘后,交由指导老师或有关实验人员保存。
jiuzheyang ban

⑸ 求一段二叉树的代码,创建,包括结构体创建,按顺序保存12 23 85 55 87 99几个数字,谢

我有一个二叉树的,不是你的那个,你看看吧

实验5:小型文本搜索引擎的实现(12~15学时)

[问题描述]

随着互联网技术的飞速发展,如何从海量数据中查找所需内容,不仅是科研人员关注的热点问题,许多IT公司也先后推出了各自的搜索引擎,如:Google、网络、Bing等。搜索引擎的核心是如何对Web网页构建有效的索引,以便能够快速查找和匹配查询关键词,并及时地将搜索结果返回给用户。在这个实验中,请实现一个英文单词的二叉查找树,并可根据输入的英文单词进行搜索,同时可给出单词在文档中的位置信息。

[实验目的]

(1)掌握二叉查找树的构造过程;

(2)掌握二叉查找树中结点的插入、删除等操作;

(3)掌握二叉树的前序、中序遍历;

(4)运用二叉查找树解决实际问题。

[实验内容及要求]

(1)构造二叉查找树:

①.从文件中读入内容,过滤掉阿拉伯数字和标点符号,并将英文字母的大写形式全部转换成小写形式。

②.按照英文字母表的顺序构造英文单词的二叉查找树。当两个英文单词的首字母相同时,按第二个字母进行排序,依次类推。

③.为每个英文单词建立一个单链表,用于存放该单词在文档中的位置信息(即:该单词是文档的第几个单词,序号从1开始)。如果一个单词在文档中出现多次,则该链表中将包含多个结点,并按照单词在文档中出现的次序(位置信息)递增排序。

(2)遍历二叉查找树:

①.实现二叉查找树的先序遍历,以便能够找出出现次数最多的单词;

②.搜索:输入一个待检索单词,以先序遍历的方式从二叉查找树中查找单词,如果能找到该单词,则输出该单词在原始文档中出现的位置信息,否则提示文档中不包含该检索词;

③.实现二叉查找树的中序遍历,并将遍历结果保存到文件中(words.txt)。(要求:每个单词占一行,每行依次记录单词、该单词出现的次数、以及该单词在文档中的位置信息。)

(3)删除结点:

①.给定一个停用词列表(停用词是指对搜索没有作用的词,如:of, and, a, an, the等等),将二叉查找树中的属于停用词表中的单词依次删除(不仅删除结点,还需清空记录该单词位置信息的单链表);

②.在搜索时,当输入的检索词是停用词时,则不进行查询。

[选作内容]

(1)允许一次输入两个或者更多个单词进行查询,即:先获得这些单词各自在文档中出现的位置信息,然后再分析这些单词的位置信息,判断这些单词在原始文档中是否存在连续出现的情况。

(2)尝试实现从多个文档中读入内容,构建二叉查找树,并实现多个文档的搜索。

#include<iostream>
#include<string>
#include<cstring>
usingnamespacestd;
classBinaryTreeNode
{public:
stringdata;
intw;
BinaryTreeNode*leftchild;
BinaryTreeNode*rightchild;
BinaryTreeNode*parent;
intpos[50];
BinaryTreeNode(stringa,intpostion)
{
data=a;
w=1;
leftchild=NULL;
rightchild=NULL;
parent=NULL;
pos[0]=postion;
}
};

classBSTree
{public:
BinaryTreeNode*root;
BSTree(){root=NULL;}
voidInsert(stringa,intpostion);
voidDelete(stringkey);
BinaryTreeNode*Search(stringkey,BinaryTreeNode*&pr,BinaryTreeNode*&parent);
voidInOrder(BinaryTreeNode*&root);
voidPreOrder(BinaryTreeNode*&root);
};

voidBSTree::InOrder(BinaryTreeNode*&root)
{
if(root)
{
InOrder(root->leftchild);
cout<<root->data;
cout<<""<<root->w<<endl;
InOrder(root->rightchild);
}
}

voidBSTree::PreOrder(BinaryTreeNode*&root)
{
if(root)
{
cout<<root->data;
cout<<""<<root->w<<endl;
PreOrder(root->leftchild);
PreOrder(root->rightchild);
}
}

BinaryTreeNode*BSTree::Search(stringkey,BinaryTreeNode*&pr,BinaryTreeNode*&parents)
{
BinaryTreeNode*p=root;
pr=root;
while(p)
{
parents=p;
if(key<p->data)
{
pr=p;
p=p->leftchild;
}
elseif(key>p->data)
{
pr=p;
p=p->rightchild;
}
else
returnp;
}
returnNULL;
}

voidBSTree::Insert(stringa,intpostion)
{
BinaryTreeNode*pr,*p,*pp=NULL;
p=Search(a,pr,pp);
if(p!=NULL)
{
p->w++;
p->pos[p->w-1]=postion;
return;
}
BinaryTreeNode*r=newBinaryTreeNode(a,postion);
if(!root)
root=r;
elseif(a<pp->data)
pp->leftchild=r;
else
pp->rightchild=r;
}

voidBSTree::Delete(stringkey)
{
BinaryTreeNode*p,*pr,*pp;
p=Search(key,pp,pr);
if(p==NULL)
return;
if(p->leftchild&&p->rightchild)
{
BinaryTreeNode*s=p->rightchild,*ps=p;
while(s->leftchild)
{
ps=s;
s=s->leftchild;
}
p->data=s->data;
p->w=s->w;
for(inti=0;i<s->w;i++)
{
p->pos[i]=s->pos[i];
}
pp=ps;
p=s;
}
if(p->leftchild)
{
if(pp->leftchild==p)
{
pp->leftchild=p->leftchild;
p->leftchild->parent=pp;
}
else
{
pp->rightchild=p->leftchild;
p->leftchild->parent=pp;
}
}
elseif(p->rightchild)
{
if(pp->leftchild==p)
{
pp->leftchild=p->rightchild;
p->rightchild=pp;
}
else
{
pp->rightchild=p->rightchild;
p->rightchild->parent=pp;
}
}
else
{
if(pp->leftchild==p)
pp->leftchild=NULL;
else
pp->rightchild=NULL;
}
deletep;
}

stringWord(inti)
{
stringword[9]=
{"a","an","and",
"are","is","the",
"of","was","were",
};
returnword[i];
}
intmain()
{
BSTree*SearchTree=newBSTree;
charch;
stringstr;
inti=2;
intpos=1;
while(cin.get(ch))
{
if(ch>='a'&&ch<='z')
{
str.insert(str.end(),ch);
i=0;
}
else
{
if(ch>='A'&&ch<='Z')
{
str.insert(str.end(),char(ch+32));
i=0;
}
else
{
if(i==0)
{
SearchTree->Insert(str,pos);
pos++;
str.erase(str.begin(),str.end());
}
i++;
}
}
if(ch=='#')
break;
}
SearchTree->InOrder(SearchTree->root);
for(intk=0;k<9;k++)
{
SearchTree->Delete(Word(k));
}
SearchTree->PreOrder(SearchTree->root);
stringabc;
cout<<"请输入您要查找的字符:";
BinaryTreeNode*q,*p,*s;
while(cin>>abc)
{
p=SearchTree->Search(abc,q,s);
if(p!=NULL)
{
cout<<abc<<"在文本出现次数为:"<<p->w<<' ';
cout<<"其位置分别为:";
for(intj=0;j<p->w;j++)
{
cout<<p->pos[j]<<"";
}
}
else
cout<<"文本中没有此字符串!";
cout<<endl;
cout<<"请输入您要查找的字符:";
}
}

⑹ 求高手把我的二叉树中序、前序、后序遍历程序讲解一下

就是树的根节点做形参 假如根节点指针是p 以前序为例
如果p为空不执行任何操作程序调用结束
如果p不为空递归
调用前序遍历函数前序遍历左子树;
然后输出该节点中数据;
再调用前序遍历函数前序遍历右子树;
每一个节点都按上述三个步骤来
中序和后序同上理解
关于递归可以参照汉诺塔的问题

⑺ C语言关于二叉树的度的算法

可怜的管理员哭泣着乱踹两脚
被映得粉亮的翅膀,直到拖着尖锐的
我们为之干杯的死亡,
父亲戴一件绒毛状火红头饰
让路。白日怀疑自己,
她每天只就让复一个工作哈哈

⑻ 用C++开发一个二叉树类

// binary_tree.cpp : 定义控制台应用程序的入口点。
//last modified by Hujuly, may 13, 2008

#include "stdafx.h"
#include
#define increasement 5
using namespace std;

//--------树结点类-------------
template
class TreeNode{//定义树结点
TreeNode* left;//该结点的左孩子
Elem element;//该结点数据项
TreeNode* right;//该结点的右孩子
public:
TreeNode(){
left=right=NULL;
}
TreeNode(Elem& item){
left=right=NULL;
element=item;
}
~TreeNode(){}
void setVal(const Elem item){element=item;}//给该结点数据项赋值
Elem getVal(){return element;}//获取该结点的数据
void setLeft(TreeNode* leftNode){left=leftNode;}//设置左孩子
TreeNode* getLeftChild(){return left;}//获取左孩子
void setRight(TreeNode* rightNode){right=rightNode;}//设置右孩子
TreeNode* getRightChild(){return right;}//获取右孩子
bool isLeaf(){return ( left==NULL && right==NULL );}//判断是否为叶子
};

//---------树类----------------
template
class binTree{
private:
TreeNode* root;
Elem RefValue;//用途.ok.结束标记
void clearHlp(TreeNode* current);//清空以current为根的树
void creatHlp(TreeNode* current);//创建一棵以current为根的树
void InOrder(TreeNode* current);//中序遍历
void PreOrder(TreeNode* current);//前序遍历
void PostOrder(TreeNode* current);//后序遍历
bool findHlp(TreeNode* current,Elem data);//查找以current为根的树中是否有data
void changeRLHlp(TreeNode* current);//交换以current为根的左右子树
void printHlp(TreeNode* current,int pos);//打印树

public:
binTree(Elem e){ RefValue = e; root = new TreeNode; root->setVal(e);} //构造函数构造一棵空树
~binTree(){clearHlp(root);} //析构函数
void creatBinTree(); //创建一棵树
void clearTree();//清空树
void printTree();//打印树
bool find(Elem d);//查找d是否在树中
TreeNode* parent(TreeNode* current,TreeNode* start);//寻找双亲结点
void InOrderRoot(){ InOrder(root);}//中序
void PreOrderRoot(){PreOrder(root);}//先序
void PostOrderRoot(){PostOrder(root);}//后序
void changeRL();//交换左右子树
};
要创建二叉树,可以简单的创建一个CSimpleBinaryTree 对象并初始化。

#define MAXELEMS 100
CSimpleBinaryTree btree;
btree.Initialise(MAXELEMS,sizeof(CSomeObject));或btree.Initialise(MAXELEMS,sizeof(CSomeObject), someCompareFunction);或btree.Initialise(MAXELEMS,sizeof(CSomeObject), someCompareFunction, nGrowTrigger, nGrowByValue, nShrinkTrigger, nShrinkByValue);"someCompareFunction"是一个有两个指针参数的函数的指针,这个函数根据第一个参数是否小于,等于,大于第二个参数而分别返回负数,0和正数。CSimpleBinaryTree 提供了一个通用的全局比较函数,它可以比较两个长整型的指针。

添加元素

要向这棵树添加一个子项,可以简单的调用AddItem()并传一个指针给它,用来存放添加后的对象。在内部,相关数据通过指针被拷贝到动态分贝的内存上。CSomeObject sObj;
CSomeObject *psObj1=&sObj;
CSomeObject psObj2;
int nResult;
nResult=btree.AddItem(&sObj);或nResult=btree.AddItem(psObj1);或nResult=btree.AddItem(psObj1, psObj2);AddItem() 函数返回两个值。第一个是整型结果。如果子项被成功添加了,子项的索引值会被成功返回,如果没有成功添加,就会返回错误代码:

· DUPLICATE_FOUND

· OUT_OF_MEMORY

· TREE_IS_FULL

第二个返回值是可选择的第二个参数值。如果操作成功,那末指向新创建对象的指针被返回了, 如果操作不成功,该指针被赋值为空。

DUPLICATE_FOUND仅当公共变量m_bAllowDuplicates被设为FALSE时才返回,否则,这个树将允许复制数据(缺省情况)。

如果复制操作不被允许,那末这棵树将会在每次被搜索时都会添加子元素以便判断子元素是否存在。这一点就降低了添加子项的速度,但是也潜在的节省了内存分配的数量。

删除元素

要删除一个子项,可以简单的调用RemoveItem() 函数,并设置上我们要删除的子项的索引值。

BOOL bResult;
bResult=RemoveItem(nIndex);如果该项被成功地从树中删除了,函数返回TRUE, 否则返回FALSE;

当一个子项从树中删除时,其上面所有的元素对应的子项左移一个位置并“子项总数”减一。

这一点,说明效率并不高,潜在的,函数有可能不得不遍历整棵树.无论如何从二叉树添加和删除元素是天生的比其他的存储/修补算法要慢,这是因为二叉遍历网络树要求元素有序的事实。

遍历这棵树

要判断一个元素是否在这棵树中存在,可以简单的调用FindItem() 函数.int nIndex;
nIndex = btree.FindItem(psObj);或CSomeObject *pFoundObject;
nIndex = btree.FindItem(psObj,pFoundObject);FindItem() 返回两个值.如果子项存在,第一个值就是子项的索引值,如果不存在,赋值为ITEM_NOT_PRESENT value.第二个返回值是可选择的第二个参数值。如果子项被发现了,pFoundObject 将指向它在树中的对象,如果子项没有被发现,pFoundObject 赋为空;

在CSimpleBinaryTree 中有两个搜索算法.线性搜索和对半搜索.线性搜索只在树种子项数目小于指定值的时候才使用 (缺省为10),从这个点以后的各项,将使用对半搜索.这样做的原因是线性查找不要求元素进行排序并且它的运算规则相对要简单的多.因此对于小数目项来说,线性查找是理想的.

如果在树中允许复制(m_bAllowDuplicates=TRUE) ,那末平衡(所有子项排序)操作只有当在“被要求”的时候进行,而不是像m_bAllowDuplicates=FALSE and并且所有子项在每次添加新的子项时都会进行排序.相反地,排序可能会在调用FindItem() 函数时进行.当用FindItem()查找一个子项时,使用的是对半查找算法,即使该项存在,查找也可能失败.这样的原因是这个树并不是完全平衡的.这这种情况下,算法查找子项时,就会失败,同时也说明该树并非完全平衡的,通过排序使得该树平衡,然后再递归的调用FindItem()函数.一旦该树平衡了,一个内部标记将会被设置,并且这个标记在添加一个新元素时不会被设置,因而避免了任何一个递归的循环.因此后来的FindItem()调用就会避免重复的调用.对于程序员来说,没有必要作些特殊的操作.以上说的只是这个类中众多内部处理中一个而已.

这样在允许复制操作的时候,每添加一个子项就不必再调用SortItems() 了,从而效率得到很大的提高.此处使用的是C 语言库中的qsort()函数来实现排序算法的.

重设树的大小

通过ReSize()来设置二叉树的子项数目,以满足添加和删除的需要.btree.ReSize(300);通过调用ReSize()可以设置树中可以容纳的最大子项数. 然而当树中已经存在200个元素并且其最大容纳子项数为250, 如果作如下调用btree.ReSize(100),那末树中开始的100元素 将会传送到新的指针数组上面,而后面的120个元素将会从树中被移除,其占用的内存也会被释放掉.

通过设置公共成员变量m_bAutoResize = TRUE (缺省),该树可以通过成员变量中用于控制增减和减少的参数自动的设置元素数目的大小.

增加和消减

当公共成员变量m_bAutoResize被设为TRUE时,增加和消减参数控制树的元素数目.每项操作会有两个变量.一个触发器,一个增加/消减值.所有的值用占当前树中元素数目的百分比来表示.

触发器的值可以确定增长或消减操作的发生.增加/消减 的百分比确定了该树增加或消减的程度.

比如,如果在树中我有80 元素,被允许的最大子项数为100,m_bAutoResize 设为TRUE.同样的增长触发器被设为90 (90%) ,消减触发器被设为10 (10%),增长和消减的值都设为50 (50%).

如果我向树中添加11个元素,该树将会有91%的填充率,同时增长触发器也会被激活.那末此时该树可容纳的元素数目就会增加50%,i.e. 在内部会调用ReSize(150).同样的,如果我删除了80 个元素中的71个,该树将只有9%的填充率,消减触发器会被激活,从而导致树中可容纳元素树消减50%,i.e. 在内部会调用ReSize(50).

重设大小的操作代价昂贵,因此应该尽可能的避免.上面的例子中给出了增长/消减触发器的缺省值和增长/消减的对应值。

公共方法概述

AddItem()为新元素分配一个空间,把指针添加到二叉树的元素数组中,从而添加.向二叉树中添加一个新元素如果失败,返回负数RemoveItem()从二叉树中删除某项. 该项被删除厚,此项上面的所有指针左移一个位置,子项的数目相应地更新,如果nItem在有效的索引范围内,返回TRUEFindItem()决定使用哪一种查找算法查找元素,如果数组大小小于对半查找的开始位置,线性查找将被执行,而不是对半查找.ReSize()根据nNewSize对二叉树进行增长和消减.如果nNewSize等于当前的数目或者没有更多的内存可供分配了的话返回FALSE,否则返回 TRUE. Initialise()在一个对象被创建后,初始化函数必须被调用.设置内部成员值并为二叉树数组分配空间.GetSearchMethodThreshold()获取当前查找算法的临界值.GetTotalItems()取得当前树中存放的子项的数目.GetTreeSize()取得树中子项数目的最大值.GetShrinkTriggerValue()在消减触发器激活时,返回当前的值SetShrinkTriggerValue()设置消减触发器的值.当该树使用的空间与自身的空间百分比小于nPercentageUsed,当且仅当AutoResizing有效时,该树会自动的重新设置子项数目.缺省的消减触发器值为10%GetShrinkByPercentage()返回当前消减百分比SetShrinkByPercentage()当AutoResize 有效时,设置消减百分比的值.当AutoResize有效并且重设大小被触发时,该树将会释放nPercentDecrease相关项.GetGrowTriggerValue()在增长触发器激活时,返回当前的值SetGrowTriggerValue()设置增长触发器的值.当该树已经分配了使用的百分比时,当且仅当AutoResizing有效时,该树会自动的重新设置子项数目.缺省的增长触发器值为90%GetGrowByPercentage()返回当前增长百分比SetGrowByPercentage()当AutoResize 有效时,设置增长百分比的值.当AutoResize有效并且重设大小被触发时,该树将会给nPercentIncrease相关项分配空间.FreeMemory()释放所有的堆空间,包括二叉树数组以及其中包括的子项.用户不必调用这个函数,除非他想立刻释放内存并愿意删除二叉树. 最好的办法是,使用缺省的析构函数自动的调用这个函数.SetSearchMethodThreshold()设置对半查找的临界值,以区分何时使用对半查找和线性查找。查找方法会根据这个临界值进行切换.缺省值为10.GetItemPtr()返回一个空类型指针,用于指向在二叉树子项数组中nItem索引对应的子项的指针.如果索引值超出了有效值,返回空.GenericLongCompare()提供给用户的全局比较函数.用来比较两个long型数据(a,b).如果相等,返回0,如果a<b,返回负数如果 a>b. 返回正数DoTest()CSimpleBinarySearch类中提供了测试函数.在使用这个函数前,必须先定义BINARY_TREE_EXAMPLE .

⑼ 二叉树在程序员编写时用得上吗

可以快速查找数据

阅读全文

与程序员的二叉树舞蹈相关的资料

热点内容
java栈的元素 浏览:737
程序员与篮球事件 浏览:673
app反编译不完整 浏览:788
电脑上的文件夹怎么调整 浏览:5
服务器无响应是什么原因呀 浏览:984
wd文档里的app怎么制作 浏览:513
电脑里的文件夹没有了一般能恢复吗 浏览:418
哪里有配加密钥匙的 浏览:210
服务器开不了机怎么把数据弄出来 浏览:958
gif动态图片怎么压缩 浏览:521
黑猴子棒球压缩文件解压密码 浏览:631
如何让app适应不同的手机屏幕大小 浏览:10
苹果手机如何给安卓手机分享软件 浏览:761
苹果电脑怎么运行腾讯云服务器 浏览:59
明日之后沙石堡命令助手 浏览:261
蛋糕店用什么样的app 浏览:877
长安银行信用卡app怎么取现 浏览:635
dos命令cmd命令的 浏览:226
阿里云存档视频文件的服务器 浏览:194
ftp修改文件权限命令 浏览:491