`
hwfantasy
  • 浏览: 20817 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

java自定义二叉树

阅读更多
今天学习的是二叉树的相关知识。二叉树是树的一种,因为他每个结点最多只有2个子结点,所以叫做二叉树。链表实际上很像是树的特殊情况。二叉树有很多种,其中著名的就有二叉查找树和霍夫曼树。
引用
二叉树在图论中是这样定义的:二叉树是一个连通的无环图,并且每一个顶点的度不大于2。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。然而,没有足够的信息来区分左结点和右结点。如果不考虑连通性,允许图中有多个连通分量,这样的结构叫做森林。

以下是我的二叉树的结点类代码:
public class TNode {
	
	private Object obj;
	private TNode parent;
	private TNode left;
	private TNode right;
	
	public TNode(Object obj){
		this.obj = obj;
	}
	
	
	public TNode(){
	}

	public Object getObj() {
		return obj;
	}

	public void setObj(Object obj) {
		this.obj = obj;
	}

	public TNode getParent() {
		return parent;
	}

	public void setParent(TNode parent) {
		this.parent = parent;
	}

	public TNode getLeft() {
		return left;
	}

	public void setLeft(TNode left) {
		this.left = left;
	}

	public TNode getRight() {
		return right;
	}

	public void setRight(TNode right) {
		this.right = right;
	}
}

以下是二叉树的类(其中实现了将一个数组形成二叉查找树)
public class BinaryTree {

	private static TNode root;

	public BinaryTree() {

	}

	/**
	 * 重写二叉树的构造方法
	 * 
	 * @param obj
	 */
	public BinaryTree(Object obj) {
		root = new TNode(obj);
	}

	/**
	 * 将整型数组转化为一棵二叉查找树
	 * 
	 * @param Array
	 *            待转化的数组
	 */
	public void ArraytoTree(int[] Array) {
		if(Array.length == 0){
			throw new RuntimeException("数组长度为0,没有元素用来建树!");
		}
		int first = Array[0];
		root = new TNode(first);
		for (int i = 1; i < Array.length; i++) {
			addofBST(root, Array[i]);
		}
	}

	/**
	 * 将一个数以二叉查找树的顺序插入树中
	 * 
	 * @param node
	 * @param value
	 */
	public void addofBST(TNode node, int value) {
		TNode current;
		if ((Integer) node.getObj() >= value) {
			if (node.getLeft() != null) {
				current = node.getLeft();
				addofBST(current, value);
			}else{
				current = new TNode(value);
				current.setParent(node);
				node.setLeft(current);
			}
		}else{			
			if (node.getRight() != null) {
				current = node.getRight();
				addofBST(current, value);
			}else{
				current = new TNode(value);
				current.setParent(node);
				node.setRight(current);
			}
		}
	}
		

	/**
	 * 以选定模式遍历打印二叉树
	 * 
	 * @param node
	 *            二叉树起始结点
	 * @param style
	 *            模式,1为中左右,0为左中右,-1为左右中
	 */
	public void printTree(TNode node, int style) {
		if (node != null) {
			if (style == 1) {
				// 打印此结点
				Object obj = node.getObj();
				System.out.println(obj);
				// 得到它的左子结点,并递归
				TNode left = node.getLeft();
				printTree(left, style);
				// 得到它的右子结点,并递归
				TNode right = node.getRight();
				printTree(right, style);
			} else if (style == 0) {
				// 得到它的左子结点,并递归
				TNode left = node.getLeft();
				printTree(left, style);
				// 打印此结点
				Object obj = node.getObj();
				System.out.println(obj);
				// 得到它的右子结点,并递归
				TNode right = node.getRight();
				printTree(right, style);
			} else if (style == -1) {
				// 得到它的左子结点,并递归
				TNode left = node.getLeft();
				printTree(left, style);
				// 得到它的右子结点,并递归
				TNode right = node.getRight();
				printTree(right, style);
				// 打印此结点
				Object obj = node.getObj();
				System.out.println(obj);
			}
		}
	}

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics