码迷,mamicode.com
首页 > 其他好文 > 详细

三叉树

时间:2016-03-03 21:14:43      阅读:355      评论:0      收藏:0      [点我收藏+]

标签:

package com.txq.ternaryTree;

import java.util.HashSet;
import java.util.Set;
/**
* 自定义三叉树
* @author TongXueQiang
* @date 2016/03/03
* @since JDK 1.7
*/
public class TernaryTree {
// 根节点
private static Node root;
// 存储前缀匹配结果的集合
private Set<String> result = new HashSet<String>();

/**
* 向树中插入字符
*
* @param node
* @param word
* @return
*/
public void insert(String word) {
root = insert(root, word, 0);
}

/**
* 插入字符具体实现
*
* @param node
* @param word
* @param index
* @return
*/
private Node insert(Node node, String word, int index) {
if (word == null || word.equals("")) {
return null;
}
char[] charArray = word.toCharArray();

// 如果节点为空,创建新的节点
if (node == null) {
node = new Node(charArray[index], false);
}
// 如果当前字符小于当前节点存储的字符,插入左节点的位置
if (charArray[index] < node.storedChar) {
node.leftNode = insert(node.leftNode, word, index);
}
// 如果当前字符大于当前节点存储的字符,插入右节点的位置
else if (charArray[index] > node.storedChar) {
node.rightNode = insert(node.rightNode, word, index);
} else {// 相等
// 递归终止条件
if (index == charArray.length - 1) {
node.isCompleted = true;
} else {
node.centerNode = insert(node.centerNode, word, ++index);
}
}

return node;
}

/**
* 查找以指定前缀开头的所有字符串
*
* @param prefix
* @return
*/
public Set<String> searchPrefix(String prefix) {
// 首先查找前缀的下一个centerNode
Node node = findNode(prefix);
return searchPrefix(node, prefix);
}

/**
* 查找以指定前缀开头的所有字符串的具体实现
*
* @param node
* @param prefix
* @return
*/
private Set<String> searchPrefix(Node node, String prefix) {
if (node != null) {//递归终止条件
//如果是成词,加入到结果集中
if (node.isCompleted) {
result.add(prefix + node.storedChar);
}

searchPrefix(node.leftNode,prefix);//向左查找
searchPrefix(node.centerNode,prefix + node.storedChar);//向中间查找
searchPrefix(node.rightNode,prefix);//向右查找
}

//如果前缀是成词
if (isWord(prefix))
result.add(prefix);

return result;
}
/**
* 判断前缀是否为成词
* @param prefix
*/
private boolean isWord(String prefix) {
return isWord(root,prefix,0);
}

private boolean isWord(Node node, String prefix, int index) {
if (node == null) {
return false;
}

char[] charArray = prefix.toCharArray();
// 如果当前字符小于当前节点存储的字符,查找左节点
if (charArray[index] < node.storedChar) {
return isWord(node.leftNode, prefix, index);
}
// 如果当前字符大于当前节点存储的字符,查找右节点
else if (charArray[index] > node.storedChar) {
return isWord(node.rightNode, prefix, index);
} else {// 相等
// 递归终止条件
if (index == charArray.length - 1) {
if (node.isCompleted ) {
return true;
}
return false;
}
else {
return isWord(node.centerNode, prefix, ++index);
}

}
}

/**
* 查找前缀的下一个centerNode,作为searchPrefix的开始节点
*
* @param prefix
* @return
*/
private Node findNode(String prefix) {
return findNode(root, prefix, 0);
}

private Node findNode(Node node, String prefix, int index) {
if (prefix == null || prefix.equals("")) {
return null;
}
if (node == null) {
return null;
}
char[] charArray = prefix.toCharArray();
// 如果当前字符小于当前节点存储的字符,查找左节点
if (charArray[index] < node.storedChar) {
return findNode(node.leftNode, prefix, index);
}
// 如果当前字符大于当前节点存储的字符,查找右节点
else if (charArray[index] > node.storedChar) {
return findNode(node.rightNode, prefix, index);
} else {// 相等
// 递归终止条件
if (index == charArray.length - 1) {
return node.centerNode;
}
else {
return findNode(node.centerNode, prefix, ++index);
}
}
}

public static void main(String[] args) {
TernaryTree tree = new TernaryTree();
tree.insert("ab");
tree.insert("abc");
tree.insert("abg");
tree.insert("ar");
System.out.println(root.storedChar);
System.out.println(tree.searchPrefix("ab"));
}
}

 

package com.txq.ternaryTree;

public class Node {
public char storedChar;
public boolean isCompleted;

public Node leftNode,centerNode,rightNode;

public Node (char storedChar,boolean isCompleted) {
this.storedChar = storedChar;
this.isCompleted = isCompleted;
}
}

三叉树

标签:

原文地址:http://www.cnblogs.com/txq157/p/5239928.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!