基于XML的数据库开发-7
2013-10-14 15:58
357 查看
这次主要说的是2叉树的搜索问题。一般情况下,网上给出的2叉树搜索例子都是查找一个特定的数值。但是如果搜索小于某个数值的节点,貌似没有找到示例代码。
实际上,如果搜索小于数值Tele的节点主要注意如下几点即可:
1.当节点大于Tele的时候,只需要继续搜索当前节点的左节点 -》左节点入栈
2.当节点小于Tele的时候,则当前节点的左节点一定满足条件,此外,右节点也可能满足条件,所以也需要搜索。-》左右节点入栈
3.当前节点等于Tele的时候,当前节点的左节点满足条件。-》左节点入栈
大于/等于的处理流程基本相同。
正对上述的几点,我这里使用的回溯算法即可解决问题。
代码如下:
实际上,如果搜索小于数值Tele的节点主要注意如下几点即可:
1.当节点大于Tele的时候,只需要继续搜索当前节点的左节点 -》左节点入栈
2.当节点小于Tele的时候,则当前节点的左节点一定满足条件,此外,右节点也可能满足条件,所以也需要搜索。-》左右节点入栈
3.当前节点等于Tele的时候,当前节点的左节点满足条件。-》左节点入栈
大于/等于的处理流程基本相同。
正对上述的几点,我这里使用的回溯算法即可解决问题。
代码如下:
private void nodeToListByCondition(Node node,HashSet<Object> list,int action ,T ele) { ArrayList<Node>stack = new ArrayList<Node>(); stack.add(node); while(stack.size() != 0) { Node n = stack.remove(stack.size() - 1); int cmp = n.data.compareTo(ele); switch(action) { case Action.SQL_ACTION_EQUAL: if(cmp == 0) { list.add(n.dataCell.obj); if(n.equalList != null && n.equalList.size() != 0) { for(Object _n:n.equalList) { Node mNode = (Node)_n; list.add(mNode.dataCell.obj); } } return; } else if(cmp < 0) { if(n.right != null) { stack.add(n.right); } } else { if(n.left != null) { stack.add(n.left); } } break; case Action.SQL_ACTION_LESS_THAN: case Action.SQL_ACTION_LESS_THAN_OR_EQUAL: if(cmp < 0) { //System.out.println("wangsl,n data is " + n.data); list.add(n.dataCell.obj); if(n.equalList != null && n.equalList.size() != 0) { for(Object _n:n.equalList) { Node mNode = (Node)_n; list.add(mNode.dataCell.obj); } } if(n.left != null) { stack.add(n.left); //System.out.println("wangsl,n left data is " + n.left.data); } if(n.right != null) { stack.add(n.right); //System.out.println("wangsl,n right data is " + n.right.data); } } else if(cmp > 0) { //System.out.println("wangsl,n big data is " + n.data); if(n.left != null) { stack.add(n.left); } } else if(cmp == 0) { if(action == Action.SQL_ACTION_LESS_THAN) { if(n.left != null) { stack.add(n.left); } }else if(action == Action.SQL_ACTION_LESS_THAN_OR_EQUAL) { if(n.left != null) { stack.add(n.left); } list.add(n.dataCell.obj); if(n.equalList != null && n.equalList.size() != 0) { for(Object _n:n.equalList) { Node mNode = (Node)_n; list.add(mNode.dataCell.obj); } } } } break; case Action.SQL_ACTION_MORE_THAN: case Action.SQL_ACTION_MORE_THAN_OR_EQUAL: if(cmp > 0) { list.add(n.dataCell.obj); if(n.equalList.size() != 0) { for(Object _n:n.equalList) { Node mNode = (Node)_n; list.add(mNode.dataCell.obj); } } if(n.left != null) { stack.add(n.left); } if(n.right != null) { stack.add(n.right); } }else if(cmp < 0) { if(n.right != null) { stack.add(n.right); } }else if(cmp == 0) { if(action == Action.SQL_ACTION_MORE_THAN) { if(n.right != null) { stack.add(n.left); } }else if(action == Action.SQL_ACTION_MORE_THAN_OR_EQUAL) { if(n.right != null) { stack.add(n.left); } list.add(n.dataCell.obj); if(n.equalList != null && n.equalList.size() != 0) { for(Object _n:n.equalList) { Node mNode = (Node)_n; list.add(mNode.dataCell.obj); } } } } break; } } }