算法4

112 阅读2分钟

Q实现类似getElementsByClassName的功能

实现一个函数,查找某个DOM节点下面的包含某个class的所有DOM节点,不允许使用原生的getElementsByClassName

querySelectorAll等原生提供DOM查找函数。

function queryClassName(node, name) {
	var starts = '(^|[ \n\r\t\f])',
		ends = '([\n\r\t\f]|$)';
		
	var array = [],
	    regex = new RegExp(starts + name + ends),
		elements = node.getElementsByTagName("*"),
		length = elements.length,
		i = 0,
		element;
	
	while (i < length) {
		element = element[i];
		if(regex.test(element.className)) {
			array.push(element);
		}
		
		i += 1;
	}
	return array;
}

方式2:

function getAllClassName(attr) {
	let  arr = [];
	let  doms = document.getElementsByTagName("*");
	 for(var i = 0; i < doms.length; i ++) {
		 if(doms[i].className == attr || doms[i].className.indexof(attr + " ") != -1 || doms[i].className.indexOf(" " +attr+ " ") != -1) {
			 arr.push(doms[i])
		 }
		 return arr;
	 }
	 
	 var classNames = getAllClass('ykactive');
	 for(let i = 0; i < classNames.length; i ++) {
		 classNames[i].style.background= 'orange'
	 }
}

Qjs实现查找树

相关知识点

1节点: 树中的每个元素称为一个节点

2根节点:位于整棵树顶点的节点,它没有父节点。

3子节点:其他节点的后代

4叶子节点:没有子节点的元素成为叶子节点

5二叉树:二叉树就是一种数据结构,它的组织关系就像自然界的树一样。官方的定义为:是一个有限元素的集合。该集合或者为空,或者由一个称为根的元素,及两个不相交的,被分别称为左子树和右子树的二叉树组成。

6二叉查找树:二叉查找树也叫二叉搜索树(BST),它只允许我们在左节点存储比父节点更小的值,右节点存储比父节点更大的值,上图展示的就是一颗二叉查找树。

1.首先创建一个类,表示二叉查找树。

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

#向树中插入一个键

向树中插入一个新的键,首页应该创建一个用来表示新节点的Node类实例,因此需要new一下Node类并传入需要插入的key值,它会自动初始化为左右节点为null的一个新节点

然后,需要做一些判断先判断树是否为空,若为空,新插入的节点就作为根节点,如不为空,调用一个辅助方法insertNode()方法,将根节点和新节点传入

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

定义一下insertNode() 方法,这个方法会通过递归得调用自身,来找到新添加节点的合适位置

let 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)
		}
	}
}

未完待续。。。

扫码可以领10g前端资料,也可回复加群,加入交流群。

另有github每日更新精选面试题欢迎star github.com/qdleader/qd…