您的位置:首页 > 理论基础 > 数据结构算法

数据结构之二叉树的使用技巧(一)

2013-10-20 17:49 267 查看
经常看到有些人写关于二叉树的一些博客,说了很多概念,然后建立二叉树那块的方法真是让我拙计啊,看到好多人是这样建立的,代码大概是这样:

public class BinaryTree {
int data;
BinaryTree left;
BinaryTree right;
public BinaryTree(int d,BinaryTree l,BinaryTree r){
data=d;
left=l;
right=r;
}
//其它遍历方法之类的。。。不再重复
public static void main(String[] args) {
//每次建立一个节点,然后其它的节点与以前的节点进行关联
BinaryTree bt1=new BinaryTree(1,null,null);
BinaryTree bt2=new BinaryTree(2,bt1,null);
BinaryTree bt5=new BinaryTree(5,null,null);
BinaryTree bt4=new BinaryTree(4,null,bt5);
BinaryTree root=new BinaryTree(3,bt2,bt4);
}

}


第二种方法:上边那种太蛋疼了,写下个人建立的方法,这种写法使用了Java中的方法调用链,可以很准确的控制每个节点的左右子树,而且很直观,缺点就是如果数据量大了还是不方便

public static class BTNode {
public BTNode left, right;
public int data;

public BTNode(int d){
data=d;
left=null;
right=null;
}
public BTNode getLeft() {
return left;
}

public BTNode setLeft(BTNode left) {
this.left = left;
return this;
}

public BTNode getRight() {
return right;
}

public BTNode setRight(BTNode right) {
this.right = right;
return this;
}

public int getData() {
return data;
}

public BTNode setData(int data) {
this.data = data;
return this;
}

public void printNode() {
System.out.print(data+"\t");
}
public static void main(String[] args) {
//构建一个二叉树
BTNode root=new BTNode(10);
root.setLeft(new BTNode(5)
.setLeft(new BTNode(7))
.setRight(new BTNode(8)))
.setRight(new BTNode(10)
.setLeft(new BTNode(1)
.setRight(new BTNode(3)))
.setRight(new BTNode(2)));
}
}


这种方法还有建立二叉排序树的方法,用这种方法建立的二叉树在中序遍历时,打印出来的是经过排序的数字:

public class BinarySortTree {
// 二叉树的跟节点
private BTNode root = null;

/** 添加节点 */
public BinarySortTree addNode(int n) {
if (root == null) {
root=new BTNode(n);
}
addNode(root,n);
return this;
}

private void addNode(BTNode node,int n){
if(n<node.getData()){
if(node.getLeft()==null) node.setLeft(new BTNode(n));
else addNode(node.getLeft(),n);
}else{
if(node.getRight()==null) node.setRight(new BTNode(n));
else addNode(node.getRight(),n);
}
}
/**
* 得到二叉树的跟节点引用
*/
public BTNode getRoot() {
return root;
}
/**
* 中序遍历
*/
public void inOrderVisit(){
visit1(root);
}

/**中序遍历*/
private void visit1(BTNode root){
if(null!=root){
visit1(root.getLeft());
root.printNode();
visit1(root.getRight());
}
}
public static void main(String[] args) {
BinarySortTree b=new BinarySortTree();
b.addNode(7).addNode(4).addNode(18).addNode(2)
.addNode(3).addNode(5);
b.inOrderVisit();
}

/**
* 二叉树的节点,抽象层次不同,包含左右子节点和跟的值
*/
public static class BTNode {
public BTNode left, right;
public int data;

public BTNode(int d){
data=d;
left=null;
right=null;
}
public BTNode getLeft() {
return left;
}

public BTNode setLeft(BTNode left) {
this.left = left;
return this;
}

public BTNode getRight() {
return right;
}

public BTNode setRight(BTNode right) {
this.right = right;
return this;
}

public int getData() {
return data;
}

public BTNode setData(int data) {
this.data = data;
return this;
}

public void printNode() {
System.out.print(data+"\t");
}
}
}


上边的代码中的遍历二叉树的方法可以再写简单一点,可以更简略的类似函数式编程的思想写为如下:

public void inOrderVisit1(){
new Object(){
void visit(BTNode root){
if(null!=root){
visit(root.getLeft());
root.printNode();
visit(root.getRight());
}
}
}.visit(getRoot());
}


最后归纳一下,其实熟练掌握数据结构还是在编程中很重要的,而且可以java语言特有的语言特性,在二叉树中可以玩出很多新的花样,比如:

1.如何按照层次来遍历一个二叉树?

2.如何按照层次来构建一个二叉树?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: