二叉树的概念:
n(n≥0)个结点的有限集合,由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成。每个根节点只有2个子节点的就叫做二叉树。
1.只有一个根节点
2.根节点只有左子树
3.根节点只有右子树
4.根节点有左子树和右子树
二叉树对应的方法有:
insert(number):插入数据
search(number):搜索对应的数据
min():数据中的最小值
max():数据中的大值
inOrderTraverse():中序遍历所有节点
preOrderTraverse():先序遍历所有节点
postOrderTraverse():后序遍历所有节点
基础数据构建:
class ChildrenTree {
constructor(data,leftChild,rightChild) {
this.leftChild = leftChild;
this.number = data;
this.rightChild = rightChild
}
}构建树:
class tree {
//data代表当前树
constructor(num) {
if(num){
//创建节点
this.data = new ChildrenTree(num);
}else{
this.data = null;
}
}
//创建节点 insertData(num){
//创建根节点
if (!this.data){
this.data = new ChildrenTree(num);
return;
}
//创建子节点(看后续方法) insertNode(num,this.data);
}
//打印数据节点
printTree(){
console.log(JSON.stringify(this.data));
}
//搜索对应节点
search(num){
if (num === this.data.number){
return true;
}
//搜索对应的方法(看后续方法)
return searchNode(num,this.data)
}
//搜索当前节点最小值
min(){
let nums = this.data;
while (checkData(nums.leftChild)){
nums = nums.leftChild;
}
return nums.number;
}
//搜索当前节点最da值 max(){
let nums = this.data;
while (checkData(nums.rightChild)){
nums = nums.rightChild;
}
return nums.number;
}
//中序遍历
inOrderTraverse(){
//中序对应方法(看后续方法)
console.log(inOrderTraverseNode(this.data));
}
//先序遍历
preOrderTraverse() {
//先序遍历方法(看后续方法)
console.log(preOrderTraverseNode(this.data));
}
//后序遍历
postOrderTraverse() {
//后序遍历方法(看后续方法)
console.log(postOrderTraverseNode(this.data));
}
}对应的方法:
//后序遍历递归方法实现
function postOrderTraverseNode(data) {
let res = [];
if (data.leftChild){
res = res.concat(postOrderTraverseNode(data.leftChild));
};
if(data.rightChild){
let rig = postOrderTraverseNode(data.rightChild);
res = res.concat(rig);
}
res.push(data.number);
return res;
}
//先序遍历方法递归方法实现
function preOrderTraverseNode(data) {
let res = [];
res.push(data.number);
if (data.leftChild){
res = res.concat(preOrderTraverseNode(data.leftChild));
};
if(data.rightChild){
let rig = preOrderTraverseNode(data.rightChild);
res = res.concat(rig);
}
return res;
}
//中序遍历方法递归方法实现
function inOrderTraverseNode(data) {
let res = [];
if (data.leftChild){
res = res.concat(inOrderTraverseNode(data.leftChild));
};
res.push(data.number);
if(data.rightChild){
let rig = inOrderTraverseNode(data.rightChild);
res = res.concat(rig);
}
return res;
}
//检查当前数据是否为空
function checkData(number){
if (number === undefined || number === null || number === ''){
return false;
}
return true;
}
//递归数据插入
function insertNode(num,current) {
if (!current){
current = new ChildrenTree(num);
return;
}
if (num > current.number){
if (current.rightChild){
insertNode(num,current.rightChild);
}else{
current.rightChild = new ChildrenTree(num);
}
}else {
if (current.leftChild){
insertNode(num,current.leftChild);
}else{
current.leftChild = new ChildrenTree(num);
}
}
}
//递归查询当前数据
function searchNode(num,current) {
if (!current){
return false;
}
if (current.number === num){
return true;
}
if (num > current.number){
return searchNode(num,current.rightChild);
}else{
return searchNode(num,current.leftChild);
}
}进行数据测试:
function init() {
let tree1 = new tree();
tree1.insertData(11);
tree1.insertData(13);
tree1.insertData(7);
tree1.insertData(5);
tree1.insertData(8);
tree1.insertData(1);
tree1.insertData(2);
tree1.insertData(18);
tree1.printTree();
console.log(tree1.search(11));
console.log(tree1.search(2));
console.log(tree1.search(18));
console.log(tree1.search(17));
console.log(tree1.min())
console.log(tree1.max());
tree1.inOrderTraverse();
tree1.preOrderTraverse();
tree1.postOrderTraverse();
}
init();打印数据结果:

对应生成的树结构:

结果与理论结果一样。