利用二叉搜素树能够帮助我们更好的理解树和排序相结合的思想,而且每次的遍历,无论是迭代还是递归,都很考察我们的逻辑思考能力,还是感觉要多多练习尝试去做。
SearchTreeNode 类
package 数据结构_二叉搜索树;
public class SearchTreeNode {
private int element;
private SearchTreeNode left,right;
public SearchTreeNode(int element) {
this.element = element;
left = null;
right = null;
}
public int getElement() {
return element;
}
public void setElement(int element) {
this.element = element;
}
public SearchTreeNode getLeft() {
return left;
}
public void setLeft(SearchTreeNode left) {
this.left = left;
}
public SearchTreeNode getRight() {
return right;
}
public void setRight(SearchTreeNode right) {
this.right = right;
}
}
Ordertree 类
package 数据结构_二叉搜索树;
import 数据结构_二叉树.BinaryTreeNode;
public class Ordertree {
/**
* 前序遍历
* @param root a root of preorder
*/
public void preorder(SearchTreeNode root){
if(root.getLeft() == null && root.getRight() == null){
System.out.print(root.getElement()+" ");
return;
}
else{
System.out.print(root.getElement()+" ");
if(root.getLeft() != null)
preorder(root.getLeft());
if(root.getRight() != null)
preorder(root.getRight());
}
}
/**
* 中序遍历
* @param root root a root of infixorder
*/
public void infixorder(SearchTreeNode root){
if(root.getLeft() == null && root.getRight() == null){
System.out.print(root.getElement()+" ");
return;
}
else{
if(root.getLeft() != null)
infixorder(root.getLeft());
System.out.print(root.getElement()+" ");
if(root.getRight() != null)
infixorder(root.getRight());
}
}
/**
* 后序遍历
* @param root root a root of postorder
*/
public void postorder(SearchTreeNode root){
if(root.getLeft() == null && root.getRight() == null){
System.out.print(root.getElement()+" ");
return;
}
else{
if(root.getLeft() != null)
postorder(root.getLeft());
if(root.getRight() != null)
postorder(root.getRight());
System.out.print(root.getElement()+" ");
}
}
}
SearchLinkedTree 类
package 数据结构_二叉搜索树;
import 数据结构_二叉树.TraversalTree;
public class SearchLinkedTree {
public SearchLinkedTree() {
}
//添加元素方法,尝试了迭代遍历结点
public void addElement(int element,SearchTreeNode node) {
if (node == null)
node.setElement(element);
while (node != null) {
if (element < node.getElement()) {
if (node.getLeft() == null) {
node.setLeft(new SearchTreeNode(element));
System.out.println(element+"插到了"+node.getElement()+"左边");
break;
}
node = node.getLeft();
} else {
if (node.getRight() == null) {
node.setRight(new SearchTreeNode(element));
System.out.println(element+"插到了"+node.getElement()+"右边");
break;
}
node = node.getRight();
}
}
}
//删除结点元素方法,利用中序递归遍历。flag属性用来查看是否删除成功
int flag = 0;
public void removeElement(int element,SearchTreeNode root){
if(root.getElement() == element){
root.setElement(root.getRight().getElement());
root.setRight(null);
flag = 1;
}
if(root.getLeft() == null && root.getRight() == null){
return;
}
else{
if(root.getLeft() != null)
removeElement(element,root.getLeft());
if(root.getRight() != null)
removeElement(element,root.getRight());
}
}
//生成order对象,用来遍历二叉搜索树
public void order(SearchTreeNode root){
Ordertree tra = new Ordertree();
System.out.print("\n前序:");
tra.preorder(root);
System.out.print("\n中序:");
tra.infixorder(root);
System.out.print("\n后序:");
tra.postorder(root);
}
}
测试类
package 数据结构_二叉搜索树;
public class TEST {
public static void main(String[] args) {
SearchLinkedTree root = new SearchLinkedTree();
SearchTreeNode node = new SearchTreeNode(3);
root.addElement(5,node);
root.addElement(2,node);
root.addElement(7,node);
root.addElement(1,node);
root.addElement(4,node);
root.order(node);
root.removeElement(5,node);
if(root.flag == 1){
System.out.println("\n\n(Deleted successfully!!!)");
root.order(node);
}
else
System.out.println("\n\n(Sorry,not find this element!!!)");
}
}