两叉树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;
}