基于XML的数据库开发-7

    这次主要说的是2叉树的搜索问题。一般情况下,网上给出的2叉树搜索例子都是查找一个特定的数值。但是如果搜索小于某个数值的节点,貌似没有找到示例代码。

    实际上,如果搜索小于数值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;
    		}
    	}
    }

猜你喜欢

转载自blog.csdn.net/wang_sun_1983/article/details/12710091