您的位置:首页 > 理论基础 > 数据结构算法

javascript数据结构系列(六)-二叉树(2)

2017-09-14 15:03 225 查看

遍历二叉树和线索二叉树

遍历二叉树

在二叉树的一些应用中,常常要求在树中查找具有某种特征的结点,或者对树中全部结点逐一进行某种处理。这就提出了一个遍历二叉树的问题,即如何按照某条搜索路径寻访树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。

基于二叉树的递归定义,可得下属遍历二叉树的递归算法定义:

先序遍历二叉树的操作定义为

若二叉树为空,则空操作,否则:

访问根结点

先序遍历左子树

先序遍历右子树

中序遍历二叉树的操作定义为

若二叉树为空,则空操作,否则:

中序遍历左子树

访问根结点

中序遍历右子树

后序遍历二叉树的操作定义为

若二叉树为空,则空操作,否则:

后序遍历左子树

后序遍历右子树

访问根结点

遍历实现

//先序遍历
function preOrderTraverse(node){
if(!(node === null)){
console.log(node.show());
preOrderTraverse(node.lchild);
preOrderTraverse(node.rchild);
}
};
// 中序遍历
function inOrderTraverse(node) {
if(!(node == null)) {
inOrderTraverse(node.lchild);
console.log(node.show());
inOrderTraverse(node.rchild);
}
};
//后序遍历
function postOrderTraverse(node){
if(!(node === null)){
postOrderTraverse(node.lchild);
postOrderTraverse(node.rchild);
console.log(node.show());
}
};
//查找最小值
function GetMin(T){
var current = T.root;
//因为较小的值总是在左子树上
while(!(current.lchild === null)){
current = current.lchild;
}
return current.data;
};
//查找最大值
function GetMax(T){
var current = T.root;
while(!(current.rchild === null)){
current = current.rchild;
}
return current.data;
};
//查找给定值
function searchData(T,data){
//先比较该值和当前结点的值的大小
var current = T.root;
while(!(current === null)){
if(current.data === data){
return current;
}else if(data < current.lchild){
current = current.lchild;
}else{
current = current.rchild;
};
}
return null;
};


删除实现

function remove(T,data){
root = removeNode(T.root,data);
};
function getSmalllest(biNode){
if(biNode.lchild === null){
return biNode;
}else{
return getSmalllest(biNode.lchild);
}
};
function removeNode(biNode,data){
if(biNode === null){
return null;
}
if(data === biNode.data){
//没有子结点的结点
if(biNode.lchild === null && biNode.rchild === null){
return null;
}
//没有左孩子的结点
if(biNode.lchild === null){
return biNode.rchild;
}
//没有右孩子的结点
if(biNode.rchild === null){
return biNode.lchild;
}
//有2个孩子的结点
var temNode = getSmalllest(biNode.rchild);
biNode.data = temNode.data;
biNode.rchild = removeNode(biNode.rchild,temNode.data);
return biNode;
}else if(data < biNode.data){
biNode.lchild = removeNode(biNode.lchild,data);
return biNode;
}else{
biNode.rchild = removeNode(biNode.rchild,data);
return biNode;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: