场景说明:
1、二叉树遍历-插入、查找、遍历操作实现
2、因为删除节点,需要重组二叉树,通常性能较低,该示例采用isDelete标识节点状态
3、适应场景:key不能重复,推荐自增序列,不允许插入之前使用过的key作为新Node的key,则能保证find/delete按照key删除指定元素(否则可能出现删除、查找不到对应元素的情况)
代码实现:
PrefixNode.java
public class PrefixNode
{
private int key;
private String data;
private PrefixNode leftNode;
private PrefixNode rightNode;
// 由于树状结构删除需要重组,麻烦且影响性能,可以通过删除标志位标识是否已经删除
private boolean isDelete = false;
public PrefixNode()
{
}
public PrefixNode(int key, String data)
{
this.key = key;
this.data = data;
}
// 用于标识节点是否被删除
// private boolean isDelete;
public int getKey()
{
return key;
}
public void setKey(int key)
{
this.key = key;
}
public String getData()
{
return data;
}
public void setData(String data)
{
this.data = data;
}
public PrefixNode getLeftNode()
{
return leftNode;
}
public void setLeftNode(PrefixNode leftNode)
{
this.leftNode = leftNode;
}
public PrefixNode getRightNode()
{
return rightNode;
}
public void setRightNode(PrefixNode rightNode)
{
this.rightNode = rightNode;
}
public boolean isDelete()
{
return isDelete;
}
public void setDelete(boolean isDelete)
{
this.isDelete = isDelete;
}
@Override
public String toString()
{
return "PrefixNode [key=" + key + ", data=" + data + ", leftNode="
+ leftNode + ", rightNode=" + rightNode + ", isDelete=" + isDelete
+ "]";
}
}
Tree.java
public interface Tree
{
// 根据节点值查询Node
PrefixNode find(int key);
// 插入节点
boolean insert(int key, String data);
// 中序遍历
void infixOrder(PrefixNode current);
// 前序遍历
void preOrder(PrefixNode current);
// 后序遍历
void postOrder(PrefixNode current);
// 查找最大值
public PrefixNode findMax();
// 查找最小值
public PrefixNode findMin();
// 插入节点
boolean delete(int key);
}
PrefixTree.java
/**
* 当前tree使用delete标识已删除节点
*
* 适应场景:
* key需要使用自增序列,不插入之前使用过的key作为新Node的key
*/
public class PrefixTree implements Tree
{
private PrefixNode root;
public PrefixNode getRoot()
{
return root;
}
public void setRoot(PrefixNode root)
{
this.root = root;
}
// 查找一个元素
@Override
public PrefixNode find(int key)
{
PrefixNode current = root;
while (current != null)
{
if (current.getKey() > key)
{
current = current.getLeftNode();
}
else if (current.getKey() < key)
{
current = current.getRightNode();
}
else
{
if (!current.isDelete()) // 未被删除
{
return current;
}
// 返回空
return null;
}
}
return null;
}
@Override
public boolean insert(int key, String data)
{
PrefixNode newNode = new PrefixNode(key, data);
if (root == null)
{
root = newNode;
return true;
}
else
{
PrefixNode current = root;
PrefixNode parent = null;
while (current != null)
{
parent = current;
if(current.getKey() > key)
{
current = current.getLeftNode(); // 搜索左子节点
if (current == null)
{
parent.setLeftNode(newNode);
return true;
}
}
else
{
current = current.getRightNode(); // 搜索右子节点
if (current == null)
{
parent.setRightNode(newNode);
return true;
}
}
}
}
return false;
}
@Override
public void infixOrder(PrefixNode current)
{
if (current.getLeftNode() != null)
{
infixOrder(current.getLeftNode());
}
System.out.println(current + " ");
if (current.getRightNode() != null)
{
infixOrder(current.getRightNode());
}
}
@Override
public void preOrder(PrefixNode current)
{
System.out.println(current + " ");
if (current.getLeftNode() != null)
{
preOrder(current.getLeftNode());
}
if (current.getRightNode() != null)
{
preOrder(current.getRightNode());
}
}
@Override
public void postOrder(PrefixNode current)
{
if (current.getLeftNode() != null)
{
postOrder(current.getLeftNode());
}
if (current.getRightNode() != null)
{
postOrder(current.getRightNode());
}
System.out.println(current + " ");
}
@Override
public PrefixNode findMax()
{
PrefixNode current = root;
PrefixNode maxNode = root;
while(current != null)
{
maxNode = current;
current = current.getRightNode();
}
return maxNode;
}
@Override
public PrefixNode findMin()
{
PrefixNode current = root;
PrefixNode minNode = root;
while(current != null)
{
minNode = current;
current = current.getLeftNode();
}
return minNode;
}
// 删除一个元素
@Override
public boolean delete(int key)
{
boolean flag = false;
if (root == null)
{
System.out.println("tree is empty");
return flag;
}
PrefixNode current = root;
while (current != null)
{
if (current.getKey() > key)
{
current = current.getLeftNode();
}
else if (current.getKey() < key)
{
current = current.getRightNode();
}
else
{
current.setDelete(true);
flag = true;
return flag;
}
}
return flag;
}
public static void main(String args[])
{
String prefix_value_str = "prefix";
PrefixTree tree = new PrefixTree();
for(int i=1; i<=5; i++)
{
tree.insert(i, prefix_value_str + i);
}
tree.insert(2, prefix_value_str + 2);
// 最大元素
System.out.println("max node: " + tree.findMax());
// 最小元素
System.out.println("min node: " + tree.findMin());
// 中序 前序 后序遍历
System.out.println("===============infixOrder======================");
tree.infixOrder(tree.find(1));
System.out.println("================preOrder=====================");
tree.preOrder(tree.find(1));
System.out.println("=================postOrder====================");
tree.postOrder(tree.find(1));
// 删除元素
tree.delete(2);
System.out.println("=================delete====================");
// 中序 前序 后序遍历
System.out.println("===============infixOrder======================");
tree.infixOrder(tree.find(1));
System.out.println("================preOrder=====================");
tree.preOrder(tree.find(1));
System.out.println("=================postOrder====================");
tree.postOrder(tree.find(1));
}
}
代码输出:
max node: PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false]
min node: PrefixNode [key=1, data=prefix1, leftNode=null, rightNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=false], isDelete=false]
===============infixOrder======================
PrefixNode [key=1, data=prefix1, leftNode=null, rightNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=false], isDelete=false]
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=false]
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false]
PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false]
PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false]
PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false]
================preOrder=====================
PrefixNode [key=1, data=prefix1, leftNode=null, rightNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=false], isDelete=false]
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=false]
PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false]
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false]
PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false]
PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false]
=================postOrder====================
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false]
PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false]
PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false]
PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false]
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=false]
PrefixNode [key=1, data=prefix1, leftNode=null, rightNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=false], isDelete=false]
=================delete====================
===============infixOrder======================
PrefixNode [key=1, data=prefix1, leftNode=null, rightNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=true], isDelete=false]
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=true]
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false]
PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false]
PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false]
PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false]
================preOrder=====================
PrefixNode [key=1, data=prefix1, leftNode=null, rightNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=true], isDelete=false]
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=true]
PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false]
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false]
PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false]
PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false]
=================postOrder====================
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false]
PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false]
PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false]
PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false]
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=true]
PrefixNode [key=1, data=prefix1, leftNode=null, rightNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=true], isDelete=false]