① 二叉树能干吗

二叉树应用非常广泛。首先二叉树是树的基础,利用二叉树可以构造树和森林。在操作系统源程序中,树和森林被用来构造文件系统。我们看到的window和linux等文件管理系统都是树型结构。在编译系统中,如C编译器源代码中,二叉树的中序遍历形式被用来存放C 语言中的表达式。在游戏设计领域,许多棋类游戏的步骤都是按树型结构编写。其次二叉树本身的应用也非常多,如哈夫曼二叉树用于JPEG编解码系统(压缩与解压缩过程)的源代码中,甚至于编写处理器的指令也可以用二叉树构成变长指令系统,另外二叉排序树被用于数据的排序。总之,二叉树应用广泛,应好好掌握。

html5中怎么在canvas中画一个二叉树

用html5开发随机生成的大树,你应该没想到40+行代码就可以搞定了吧~接下来就跟大家说说这棵大树是如何在html5开发中实现的。
同样必须要有html容器。新建Index.html,代码如下:
<、html>
1 <、head>
2 <、meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
3 <、title>canvas tree
4 <、/head>
5 <、body>
6 <、script type="text/javascript" src="tree.js">
7 <、/body>
8 <、/html>
接下来咱们开始tree.js:
、var canvas = document.createElement("canvas");
9 var ctx = canvas.getContext("2d");
10 canvas.width = 640;
11 canvas.height = 480;
12 document.body.appendChild(canvas);
代码很好理解,创建一个canvas画布,然后选择为2d画布,设置长宽,最后将这个画布添加到body标签下。
这个脚本最重要的函数在下面,大树就是递归调用这个函数实现的,调用一次画一条线段:
var drawTree = function (ctx, startX, startY, length, angle, depth, branchWidth){
13 var rand = Math.random,
14 newLength, newAngle, newDepth, maxBranch = 3,
15 endX, endY, maxAngle = 2 * Math.PI / 4,
16 subBraches;
17 ctx.beginPath();
18 ctx.moveTo(startX, startY);
19 endX = startX + length * Math.cos(angle);
20 endY = startY + length * Math.sin(angle);
21 ctx.lineCap = 'round';
22 ctx.lineWidth = branchWidth;
23 ctx.lineTo(endX, endY);
24 if (depth <= 2){
25 ctx.strokeStyle = 'rgb(0,' + (((rand() * 64) + 128) >> 0) + ',0)';
26 } else {
27 ctx.strokeStyle = 'rgb(' + (((rand() * 64) + 64) >> 0) + ',50,25)';
28 }
29 ctx.stroke();
30 newDepth = depth - 1;
31 if (!newDepth)
32 return;
33 subBranches = (rand() * (maxBranch - 1)) + 1;
34 branchWidth *= 0.7;
35 for (var i = 0; i < subBranches; i++){
36 newAngle = angle + rand() * maxAngle - maxAngle * 0.5;
37 newLength = length * (0.7 + rand() * 0.3);
38 drawTree(ctx, endX, endY, newLength, newAngle, newDepth, branchWidth);
39 }
40 }
接下来一点点解释:
首先,解释下各个变量的含义。ctx就是前面我们的2d画布;startX是线段开始的横坐标,同理startY是纵坐标;length是线段长度;angle是角度;depth是深度,叶子深度为1,树干为12(可自己设定);branchWidth就线段的粗细。有了这些信息,其实就描述了一个线段,通过这些信息我们才能画一个线段。
接下来又很可耻地一大段定义:
var rand = Math.random,
41 newLength, newAngle, newDepth, maxBranch = 3,
42 endX, endY, maxAngle = 2 * Math.PI / 4,
43 subBraches;
rand其实就是随机一个0~1之间的实数,顾名思义,接下来这些new的就是下一节线段的各种参数。maxBranch就是最多有3个分叉,最大的角度 PI/2 即为,下一级调整角度在90%范围内。subBranches就是分叉的个数。
好了,重要可以画了:
ctx.beginPath();
44 ctx.moveTo(startX, startY);
45 endX = startX + length * Math.cos(angle);
46 endY = startY + length * Math.sin(angle);
47 ctx.lineCap = 'round';
48 ctx.lineWidth = branchWidth;
49 ctx.lineTo(endX, endY);
beginPath()表示告诉浏览器“我要开始画了!”,把之前的记录放弃了,这点有点像ps。moveTo()把光标移动到(startX, startY),再计算终点坐标,endX,endY,有点像高中学的参数方程。然后告诉浏览器,lineCap要round,线段的两头要是圆形的。有多粗呢?等于branchWidth。线段一直画到(endX, endY)。
if (depth <= 2){
50 ctx.strokeStyle = 'rgb(0,' + (((rand() * 64) + 128) >> 0) + ',0)';
51 } else {
52 ctx.strokeStyle = 'rgb(' + (((rand() * 64) + 64) >> 0) + ',50,25)';
53 }
如果是已经画到了最后两级,即为叶子,那么就rgb就为(0, 128~192, 0)(rgb代表颜色,分别为红绿蓝,red green blue)。还没的话,就在(64~128, 50 ,25)中取。大家可能发现了,rgb必须为整数,但是rand()只能rand实数。大家其实也注意到了有个” >> 0″,js当中表示位运算,整体向右移动n位,0就是移动0位。其实它的作用和Math.floor()一样,但是速度更快。
动手画!
ctx.stroke();
这个线段就画好了,是时候准备下它的分叉的时候了。
newDepth = depth - 1;
54 if (!newDepth)
55 return;
如果这个线段是最后一级,就没有分叉了,也是一个递归的终止条件。
subBranches = (rand() * (maxBranch - 1)) + 1;
56 branchWidth *= 0.7;
57 for (var i = 0; i < subBranches; i++){
58 newAngle = angle + rand() * maxAngle - maxAngle * 0.5;
59 newLength = length * (0.7 + rand() * 0.3);
60 drawTree(ctx, endX, endY, newLength, newAngle, newDepth, branchWidth);
61 }
分叉数是1~3中的一个数。然后有多少个分叉,就画几条线段,newAngle为原角度调整90度之内,新长度为原长度的0.7~1.0之间。
最后画出主干,这棵树就可以开始画了。
drawTree(ctx, 320, 470, 60, -Math.PI / 2, 12, 12);
大家可能注意到角度为负,不符合传统观念。但你要知道,画布的纵坐标和传统的坐标轴正好是相反的。
好了,html5开发随机生成的大树代码就这样完成了,怎么样,一点都难吧!

③ 二叉树遍历的动态显示用哪种语言做比较好,flash编程还是HTML5

都不行。

二叉树涉及到指针。
目前有指针的语言只有C语言、C++语言、Pascal 语言、C# 语言。
其中在C#中使版用指针必须框在unsafe块中权,所以功能不强。
Pascal 现在与不常用了。建议C语言和C++语言。

另外,Flash可以编程,而HTML语言不能编程。
在HTML中,顶多插入一些JavaScript或VBScript,进行少量编程。

④ 二叉树的作用

树,连通但没有回路的图
二叉树是一类非常重要的树形结构,它可以递归地定义如下:

二叉树T是有限个结点的集合,它或者是空集,或者由一个根结点u以及分别称为左子树和右子树的两棵互不相交的二叉树u(1)和u(2)组成。若用n,n1和n2分别表示T,u(1)和u(2)的结点数,则有n=1+n1+n2 。u(1)和u(2)有时分别称为T的第一和第二子树。

⑤ 二叉树是度为2的有序树()

二叉树是度为2的有序树,这个说法错误。二叉树的度不大于2。

有序树的结点次序是相对于另一结点而言的,若有序树的子树中只有一个孩子时,这个孩子的结点无须区分左右次序;二叉树无论孩子树是否为2,均需确定左右次序。

树结构通常结合了另外两种数据结构的优点:一种是有序数组,另外一种是链表。 树结构的查询的速度和有序数组一样快,树结构的插入数据和删除数据的速度也和链表一样快。

(5)html二叉树扩展阅读

在任意一颗非空树中:

1)有且仅有一个特定的称为根(Root)的结点;

2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、......、Tn,其中每一个集合本身又是一棵树,并且称为根的子树。

此外,树的定义还需要强调以下两点:

1)n>0时根结点是唯一的,不可能存在多个根结点,数据结构中的树只能有一个根结点。

2)m>0时,子树的个数没有限制,但它们一定是互不相交的。

⑥ 求用js做成的二叉树代码,高分重谢!

网络搜ztree就是你想要的

用ztree就更简单了

URL:http://www.ztree.me

查看源代码发现其实自己实现其实也很简单的

有图为证:

⑦ 到底什么是前端二叉树的遍历

二叉树遍历代码
#include"iostream.h"
#include"stdlib.h"
#include"stdio.h"
#include<stack>
using namespace std;
#define NULL 0
#define OK 1
#define OVERFLOW -1
typedef int Status;
typedef struct node
{
char data;
struct node *lchild;
struct node *rchild;
}*bitree;
int k=0;
int depth(bitree T)//树的高度
{
if(!T)return 0;
else
{
int m=depth(T->lchild); int n=depth(T->rchild); return (m>n?m:n)+1;
}
}
//先序,中序 建树
struct node *create(char *pre,char *ord,int n) {
struct node * T;
int m;
T=NULL;
if(n<=0)
{
return NULL;
}
else
{

⑧ 二叉树的实现演示

范例二叉树:
A
B C
D E
此树的顺序结构为:ABCD##E intmain(){node*p=newnode;node*p=head;head=p;stringstr;cin>>str;creat(p,str,0)//默认根节点在str下标0的位置return0;}//p为树的根节点(已开辟动态内存),str为二叉树的顺序存储数组ABCD##E或其他顺序存储数组,r当前结点所在顺序存储数组位置voidcreat(node*p,stringstr,intr){p->data=str[r];if(str[r*2+1]=='#'||r*2+1>str.size()-1)p->lch=NULL;else{p->lch=newnode;creat(p->lch,str,r*2+1);}if(str[r*2+2]=='#'||r*2+2>str.size()-1)p->rch=NULL;else{p->rch=newnode;creat(p->rch,str,r*2+2);}}

⑨ 二叉树的基本操作 C语言版的

#include <iostream.h>
typedef struct BiTNode
{
char data;
int bit;
struct BiTNode *lchild,*rchild,*parent;
}BiTNode;

void InitBT(BiTNode *&t)//1、初始化,不带头结点
{
t=NULL;
}

/*void InitBT(BiTNode *t)//初始化,带头结点
{
t=new BiTNode;
t->lchild=t->rchild=t->parent=NULL;
}*/

int EmptyBT(BiTNode *t)//判断队空
{
if(t==0)
return 1;
else
return 0;
}

BiTNode *creatBT(BiTNode *t,int b)//2、创建二叉树
{
BiTNode *p;
char ch;
cin>>ch;
if(ch=='#')return 0;
else
{
p=new BiTNode;
p->data=ch;
p->parent=t;
p->bit=b;
t=p;
t->lchild=creatBT(t,0);
t->rchild=creatBT(t,1);
}
return t;
}

void preorder(BiTNode *t)//3、先序遍历
{
if(!EmptyBT(t))
{
cout<<t->data;
preorder(t->lchild);
preorder(t->rchild);
}
}

void inorder(BiTNode *t)//中序遍历
{
if(!EmptyBT(t))
{
inorder(t->lchild);
cout<<t->data;
inorder(t->rchild);
}
}

void postorder(BiTNode *t)//后序遍历
{
if(!EmptyBT(t))
{
postorder(t->lchild);
postorder(t->rchild);
cout<<t->data;
}
}

void coutBT(BiTNode *t,int &m,int &n,int &i)//4、计算二叉树中叶子结点、度为2的结点和度为1的结点的个数
{
if(!EmptyBT(t))
{
if((t->lchild==0) && (t->rchild==0))
m++;//叶子结点
else if((t->lchild!=0) && (t->rchild!=0))
i++;//度为2的结点
else
n++;//度为1的结点
coutBT(t->lchild,m,n,i);
coutBT(t->rchild,m,n,i);
}
}

void coutNode(BiTNode *t,int &k)//5、求二叉树中结点个数
{
if(!EmptyBT(t))
{
k++;
coutNode(t->lchild,k);
coutNode(t->rchild,k);
}
}

int BTdepth(BiTNode *t)//6、求二叉树的深度
{
int i,j;
if(EmptyBT(t))
return 0;
else
{
i=BTdepth(t->lchild);
j=BTdepth(t->rchild);
return (i>j?i:j)+1;
}
}

int Xdepth(BiTNode *t,char x)//7、查找x的层数
{
int num1,num2,n;
if(t==NULL)
return 0;
else{
if(t->data==x)
return 1;
num1=Xdepth(t->lchild,x);
num2=Xdepth(t->rchild,x);
n=num1+num2;
if(num1!=0||num2!=0)
n++;
return n;
}
}

static int flag;
void SearchChild(BiTNode *t,int k)//8、查找第k个结点的左右孩子
{
if(!EmptyBT(t))
{
if(k==0)
{
cout<<"位置不能为0!"<<endl;
return;
}
else
{
flag++;
if(flag==k)
{
if(t->lchild==0)
cout<<"无左孩子! ";
else
cout<<"左孩子为:"<<(t->lchild->data)<<" ";
if(t->rchild==0)
cout<<"无右孩子!"<<endl;
else
cout<<"右孩子为:"<<(t->rchild->data)<<endl;
}
else
{
SearchChild(t->lchild,k);
SearchChild(t->rchild,k);
}
}
}
}

int Xancestor(BiTNode *t,char x)//9、查找x结点祖先
{
int n,num1,num2;
if(t==NULL)
return 0;
else
{
if(t->data==x)
return 1;
num1=Xancestor(t->lchild,x);
num2=Xancestor(t->rchild,x);
n=num1+num2;
if(n!=0)
{
n++;
cout<<t->data<<" "<<endl;
}
}
}

void BTNodePath(BiTNode *t)//10、输出所有叶子结点路径
{
if(!EmptyBT(t))
{
if((t->lchild==0) && (t->rchild==0))
{
cout<<t->data<<"的路径为:";
for(BiTNode *p=t;p!=0;p=p->parent)
cout<<p->data;
cout<<endl;
}
else
{
BTNodePath(t->lchild);
BTNodePath(t->rchild);
}
}
}

void BTNodebit(BiTNode *t)//11、输出所有叶子结点编码
{
if(!EmptyBT(t))
{
if((t->lchild==0) && (t->rchild==0))
{
cout<<t->data<<"的编码为:";
for(BiTNode *p=t;p->parent!=0;p=p->parent)
cout<<p->bit;
cout<<endl;
}
else
{
BTNodebit(t->lchild);
BTNodebit(t->rchild);
}
}
}

void main()
{
BiTNode *t;
int m,n,i,d,q,k;
char x;
cout<<"1、初始化..."<<endl;
InitBT(t);

cout<<"2、创建二叉树..."<<endl;
t=creatBT(t,0);

cout<<"3.1、先序遍历..."<<endl;
preorder(t);
cout<<endl;
cout<<"3.2、中序遍历..."<<endl;
inorder(t);
cout<<endl;
cout<<"3.3、后序遍历..."<<endl;
postorder(t);
cout<<endl;

m=n=i=0;
cout<<"4、计算叶子结点,度为1的结点和度为2的结点的个数..."<<endl;
coutBT(t,m,n,i);
cout<<"叶子结点个数为:"<<m<<endl;
cout<<"度为1的结点个数为:"<<n<<endl;
cout<<"度为2的结点个数为:"<<i<<endl;

q=0;
cout<<"5、计算结点个数..."<<endl;
coutNode(t,q);
cout<<"结点个数为:"<<q<<endl;

d=0;
cout<<"6、计算深度..."<<endl;
d=BTdepth(t);
cout<<"深度为:"<<d<<endl;

cout<<"7、求x的层数..."<<endl;
cout<<"输入x:";
cin>>x;
if(Xdepth(t,x)==0)
cout<<"x不存在!"<<endl;
else
cout<<Xdepth(t,x)<<endl;

cout<<"8、输入要查找孩子的结点在先序遍历中的位置k(不等于0):";
cin>>k;
SearchChild(t,k);
if(k>flag)
cout<<"位置超出长度!"<<endl;

cout<<"9、查询结点的所有祖先,请输入结点x:";
cin>>x;
int num;
num=Xancestor(t,x);
if(num==0)
cout<<"结点不存在!"<<endl;
if(num==1)
cout<<"根结点无祖先!"<<endl;

cout<<"10、输出所有叶子结点路径(叶→根):"<<endl;
BTNodePath(t);

cout<<"11、输出所有叶子结点编码(叶→根):"<<endl;
BTNodebit(t);
}