您的位置:首页 > 数据库

基于XML的数据库开发-7

2013-10-14 15:58 357 查看
    这次主要说的是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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库