//创建一个树functionNode(value){this.value=value;this.childs=[];}var a =newNode("a");var b =newNode("b");var c =newNode("c");var d =newNode("d");var e =newNode("e");var f =newNode("f");
a.childs.push(c);
a.childs.push(f);
a.childs.push(b);
b.childs.push(d);
b.childs.push(e);functiondeepSearch(root,target){if(root==null)returnfalse;if(root.value==target)returntrue;var result=false;for(var i=0;i<root.childs.length;i++){
result|=deepSearch(root.childs[i],target);}return result ?true:false;}deepSearch(a,'f');
2.广度
//创建一个树functionNode(value){this.value=value;this.childs=[];}var a =newNode("a");var b =newNode("b");var c =newNode("c");var d =newNode("d");var e =newNode("e");var f =newNode("f");
a.childs.push(c);
a.childs.push(f);
a.childs.push(b);
b.childs.push(d);
b.childs.push(e);//roots 节点组,广度搜索,对每一层节点都遍历检查一遍,才进入下一层functionguang(roots,target){if(roots==null||roots.length==0)returnfalse;var childs=[];//存放下一层的节点for(var i=0;i<roots.length;i++){//循环只会遍历一层节点if(roots[i].value==target){returntrue;}else{
childs=childs.concat(roots[i].childs)}}returnguang(childs,target);//进入下一层}
console.log(bfs([a],"n"));
二.图的优先搜索
1.深度
//创建一个图functionNode(value){this.value = value;this.neighbor =[];}var a =newNode("a");var b =newNode("b");var c =newNode("c");var d =newNode("d");var e =newNode("e");
a.neighbor.push(b);
a.neighbor.push(c);
b.neighbor.push(a);
b.neighbor.push(c);
b.neighbor.push(d);
c.neighbor.push(a);
c.neighbor.push(b);
c.neighbor.push(d);
d.neighbor.push(b);
d.neighbor.push(c);
d.neighbor.push(e);
e.neighbor.push(d);//path 用于存放已经搜索过的节点functiondeepSearch(node, target, path){if(node ==null)returnfalse;if(path.indexOf(node)>-1)returnfalse;//查看是否已经查询过if(node.value == target)returntrue;
path.push(node);//不是target,则加入已查询数组var result =false;for(var i =0; i<node.neighbor.length ; i++){
result |=deepSearch(node.neighbor[i], target, path);}return result ?true:false;//reuslt 1 0}
console.log(deepSearch(b,"n",[]));
2.广度
//创建一个图functionNode(value){this.value = value;this.neighbor =[];}var a =newNode("a");var b =newNode("b");var c =newNode("c");var d =newNode("d");var e =newNode("e");
a.neighbor.push(b);
a.neighbor.push(c);
b.neighbor.push(a);
b.neighbor.push(c);
b.neighbor.push(d);
c.neighbor.push(a);
c.neighbor.push(b);
c.neighbor.push(d);
d.neighbor.push(b);
d.neighbor.push(c);
d.neighbor.push(e);
e.neighbor.push(d);//path 用于存放已经搜索过的节点//nodes 节点组,广度搜索,对每一层节点都遍历检查一遍,才进入下一层functionguang(nodes,target,path){if(nodes ==null||nodes.length ==0)returnfalse;var nextNodes=[];//存放下一层节点for(var i =0;i < nodes.length ; i++){//循环只会遍历一层节点if(path.indexOf(nodes[i])>-1)continue;//已经查询过,进入下一个循环
path.push(nodes[i]);//没查询过,将其加入path,下面进行查询if(nodes[i].value == target){returntrue;}else{
nextNodes = nextNodes.concat(nodes[i].neighbor);}}returnguang(nextNodes,target,path)//进入下一层节点}