两叉树javascript数据结构及算法的详细解决方案

二叉树的概念

两棵树(二叉树)n(n=0)是一组有限的节点,或者集合是空的(空的两棵树),或者由一个根节点和两棵树组成的不相交的,作为左子树的根节点和两叉树的右子树。



两叉树的特征

有了两个子树在每个节点,因此在二叉树不超过2个节点。在二叉树的每个节点是一个对象,每个数据节点有三个指针,这对父母的指针,左孩子和右孩子。每个节点的指针连接。连接的指针之间的关系是一个父亲。

两叉树节点的定义

树节点的定义如下:

复制代码代码如下所示:

结构binarytreenode

{

国际m_nvalue;

binarytreenode * m_pleft;

binarytreenode * m_pright;

};



二叉树的五种基本形式

空两叉树

只有一个根节点

只有根节点的左子树。

只有根节点的右子树

根节点的左右子树。



普通树只有两个节点,有三个节点:二个或三个,但由于两叉树是区分左右的,它将发展成五种形式如下:



特殊二叉树

倾斜的树

如第二、第三幅第一副倒数图的小图所示。

二叉树

在两个分支的树,如果所有的分支节点的左子树和右子树,和所有的叶子都在同一水平上,这样的二叉树称为满二叉树。如下图:



完全二叉树

完整的两叉树意味着左边的最后一层是满的,右边可能是满的或不满意的,其余的层都是满的,一棵深度为k的二叉树和一个2 K K - 1的节点充满两棵叉树(完全是两叉树),它是一棵深度k的树,没有空位。

完全二叉树的特征是:

叶节点只能出现在两层的底部。

下部叶必须集中在左连续位置。

倒数第二层如果有叶节点,则必须处于连续位置的正确位置。

如果节点度为1,则节点仅为左子节点。

同一节点树的两叉树,总的两叉树的深度最小。



注:完整的两叉树必须是完全二叉树,但完整的两棵树不一定是两棵叉树。

该算法如下:

复制代码代码如下所示:

布尔is_complete(树*根)

{

队列Q;

树的指针;

宽度优先遍历(水平遍历)和null,节点被放置在队列中。

Q.push(根);

而(((ptr = q.pop())!= null)

{

Q.push(PTR ->左);

Q.push(PTR ->右);

}

以确定是否没有节点访问

而(!q.is_empty())

{

ptr = q.pop();

没有访问空节点,树是空的,是不完全的两叉树。

如果(NULL)!= PTR)

{

返回false;

}

}

返回true;

}



两叉树的性质

二叉树的性质:在我1层的二叉树,最多的有2 ^(i-1)节点(我> = 1)

这两个特性的分叉树二:两叉树深度K最多有2 ^ k-1个节点(K>=1)

两叉树的顺序存储结构

二叉树的顺序存储结构是用一维数组存储两棵树中的每个节点,节点的存储位置可以体现节点之间的逻辑关系。



二叉链表

由于顺序存储的适用性不强,所以必须考虑链式存储结构,国际上普遍采用两叉树的存储方式和链式存储方式。

两叉树,每个节点最多有两个子节点,因此为它设计一个数据字段和两个指针字段是一个相对自然的想法。我们称这种链表为两叉链表。



两叉树的遍历

遍历二叉树(二叉树)是指根据根节点的某一顺序在二叉树中访问的所有节点,每个节点只访问一次,只访问一次。

遍历这两棵叉树有三种方法,如下所示:

(1)先序遍历(DLR),首先访问根结点,然后遍历左子树,最后遍历右子树。短根-左-右。

(2)中序遍历(LDR),首先遍历左子树,然后访问根结点,最后遍历右子树。左-右-或根。

(3)后序遍历(LRD),首先遍历左子树,然后遍历右子树,最后访问根节点。我们左右根。

前序遍历:

如果两树是空的,空的操作返回,否则根节点访问的第一,然后左子树的前序遍历右子树遍历,并在序。

遍历性的顺序是:b,d,h,j,c,G,G,G,G,G,G,G,G,G,G,G,G,G,G,G,G,G,G

复制代码代码如下所示:

第一次遍历

功能序(节点){

如果(节点)!= NULL){

Putstr(node.show()+);

序(节点。左);

序(节点。右);

}

}



中间序遍历:

如果树是空的,则返回空操作。否则,它从根节点开始(它不是第一次访问根节点)。它依次遍历根节点的左子树,然后访问根节点,最后遍历正确的子树。



遍历性的顺序是:h。

复制代码代码如下所示:

递归方式的使用/遍历

函数中(节点){

(如果!(节点= NULL){)

中(节点左);第一次访问左子树

Putstr(节点。节目)(+); / /访问根节点

中(节点右);最后一个访问右子树

}

}



后序遍历:

如果树是空的,空的操作返回,否则左到右前叶节点访问左、右子树的根节点遍历,最后访问。



遍历性的顺序是:h。

复制代码代码如下所示:

在遍历之后

功能后序(节点){

如果(节点)!= NULL){

PostOrder(节点。左);

PostOrder(节点。右);

PutStr(node.show()+);

}

}



两叉查找树的实现

两叉查找树(BST)是由节点组成的,因此我们定义一个节点节点对象如下所示:

复制代码代码如下所示:

函数节点(数据,左,右){

this.data =数据;

this.left =左; / /保存左节点链接

this.right =权;

=显示这;

}



函数显示(){

返回this.data; / /显示存储节点中的数据

}



求最大值和最小值

BST查找最大值和最小值是非常简单的,因为较小的值总是在左子节点,而最小值是在BST只遍历左子树直到最后一个节点发现。

找到最小

复制代码代码如下所示:

功能getmin(){

无功电流= this.root;

(当!(current.left = = null){)

电流= current.left;

}

返回current.data;

}



该方法沿着左子树遍历遍历一个接一个节点,直到BST左侧,节点被定义为:

复制代码代码如下所示:

current.left = null;



此时,当前节点上保存的值是最小值。

发现最大

在BST上查找最大值只需要遍历右子树直到找到最后一个节点,并保存节点的值是最大值。

复制代码代码如下所示:

功能getmax(){

无功电流= this.root;

(当!(current.right = = null){)

电流= current.right;

}

返回current.data;

}