JavaScript实现二叉树遍历、查询、删除

JavaScript实现数据结构可以提高我们的效率,本文介绍JavaScript实现二叉树的遍历。

二叉树中序、前序、后序遍历大家应该了解,指的是根节点遍历的顺序

首先我们建立一个二叉查找树(二叉排序树),从开始节点作为根节点,对其遍历插入,具体代码如下:

function BinaryTree(){
	var Node = function(key) {
	this.key = key;
	this.left = null;
	this.right = null; 
	};

	var root = null;

	var insertNode = function(node, newNode){
		if(newNode.key<node.key){
			if(node.left === null){
				node.left = newNode;
			} else {
				insertNode(node.left, newNode);
			}
		} else {
			if(node.right === null){
				node.right = newNode;
			} else {
				insertNode(node.right, newNode);
			} 
		}
	}

	this.insert = function(key) {
	     var newNode = new Node(key);
	     if (root === null){
		root = newNode;
            } else {
		insertNode(root,newNode);
	    }
	};
}

实现二叉排序树的中序遍历,在function里面加入以下程序:

var inOrderTraverseNode = function(node,callback){
		if(node !== null){
			inOrderTraverseNode(node.left,callback);
			callback(node.key);
			inOrderTraverseNode(node.right,callback);
		}
	}

this.inOrderTraverse = function(callback){
	inOrderTraverseNode(root,callback);// 给一个接口后具体实现的方法
}

在函数外部进行调用:

var nodes =[8,5,7,10,6];
    var binaryTree = new BinaryTree();
    nodes.forEach(function(key){
    	binaryTree.insert(key);
    });

    var callback = function(key){
    console.log(key);
    }

    binaryTree.inOrderTraverse(callback);

对其进行后序遍历和先序遍历的程序类似,只是在遍历顺序上进行了变化,下面给出完整代码:

function BinaryTree(){
	var Node = function(key) {
	this.key = key;
	this.left = null;
	this.right = null; 
	};

	var root = null;

	var insertNode = function(node, newNode){
		if(newNode.key<node.key){
			if(node.left === null){
				node.left = newNode;
			} else {
				insertNode(node.left, newNode);
			}
		} else {
			if(node.right === null){
				node.right = newNode;
			} else {
				insertNode(node.right, newNode);
			} 
		}
	}

	this.insert = function(key) {
	var newNode = new Node(key);
		if (root === null){
			root = newNode;
		} else {
			insertNode(root,newNode);
		}
	};

	var inOrderTraverseNode = function(node,callback){
		if(node !== null){
			inOrderTraverseNode(node.left,callback);
			callback(node.key);
			inOrderTraverseNode(node.right,callback);
		}
	}

	this.inOrderTraverse = function(callback){
		inOrderTraverseNode(root,callback);// 给一个接口后具体实现的方法
	}

	var preOrderTraverseNode = function(node,callback){
		if(node !== null){
			callback(node.key);
			preOrderTraverseNode(node.left,callback);
			preOrderTraverseNode(node.right,callback);
		}
	}
	this.preOrderTraverse = function(callback){
		preOrderTraverseNode(root,callback);// 给一个接口后具体实现的方法
	}

	var postOrderTraverseNode = function(node,callback){
		if(node !== null){
			postOrderTraverseNode(node.left,callback);
			postOrderTraverseNode(node.right,callback);
			callback(node.key);
		}
	}

	this.postOrderTraverse = function(callback){
		postOrderTraverseNode(root,callback);// 给一个接口后具体实现的方法
	}
}
    var nodes =[8,5,7,10,6];
    var binaryTree = new BinaryTree();
    nodes.forEach(function(key){
    	binaryTree.insert(key);
    });

    var callback = function(key){
    console.log(key);
    }
    console.log("中序遍历为:")
	binaryTree.inOrderTraverse(callback);
	console.log("前序遍历为:")
    binaryTree.preOrderTraverse(callback);
    console.log("后序遍历为:")
    binaryTree.postOrderTraverse(callback);

运行结果为:

 
中序遍历为:
5
6
7
8
10
前序遍历为:
8
5
7
6
10
后序遍历为:
6
7
5
10
8
[Finished in 0.3s]

下面实现二叉树的查询,首先实现找二叉树的最大最小值,区别在于最小值一直遍历左子树,而最大值一直在遍历右子树,这里列出找最小值:

var minNode = function(node){
		while(node && node.left !== null){
			node=node.left;
		}
		return node.key;
	}

	this.min = function(){
		return minNode(root);
	}

下面实现二叉树元素的查询,存在返回true,不存在返回false:

	var searchNode = function(node, key){
		if (node === null){
			return false;
		}

		if (key < node.key){
			return searchNode(node.left, key);
		} else if(key > node.key){
			return searchNode(node.right, key);
		} else{
			return true;
		}
	}

	this.search = function(key){
		return searchNode(root,key);
	}

二叉树结点的删除比较复杂,需要分情况讨论:

1、叶结点   

2、有一个子节点的结点

3、有两个孩子的结点,这个需要找到要删除的结点的右子树的结点中最小的结点放在要删除的结点位置上,之后删除该最小结点;这里用到刚才的min函数方法。

	var removeNode = function(node, key){
		if(node === null){
			return null;
		}

		if(key < node.key){
			node.left = removeNode(node.left,key);
			return node;
		}else if(key > node.key){
			node.right = removeNode(node.right,key);
		}else{
			if(node.left === null && node.right==null){
				node = null;
				return node;
			}
			if(node.right === null){
				node = node.right;
				return node;
			}else if(node.left === null){
				node = node.left;
				return node;
			}

			var aux = minNode(node.right);
			node.key = aux.key;
			node.right = removeNode(node.right,key);
			return node;
		}

	}

	this.remove = function(key){
		return removeNode(root,key);
	}

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值