树型结构是最常见的非线性结构,其中二叉树最为常见。今天我主要就是用java来实现一下树的一些常见操作。

       首先需要一个用来存储树节点值的javabean:

public class TreeBean {
	
	private int nodeValue;
	
	public int getNodeValue() {
		return nodeValue;
	}

	public void setNodeValue(int nodeValue) {
		this.nodeValue = nodeValue;
	}
}
       然后是树的节点bean:

public class TreeNode{

	private TreeBean data;
	private TreeNode leftNode;
	private TreeNode rightNode;
	
	//构造函数  
    public TreeNode(){  
        data = new TreeBean();  
    }
	
	public TreeBean getData() {
		return data;
	}

	public void setData(TreeBean data) {
		this.data = data;
	}

	public TreeNode getLeftNode() {
		return leftNode;
	}
	public void setLeftNode(TreeNode leftNode) {
		this.leftNode = leftNode;
	}
	public TreeNode getRightNode() {
		return rightNode;
	}
	public void setRightNode(TreeNode rightNode) {
		this.rightNode = rightNode;
	}

}
       最后是Tree的主体:

public class Tree {
	//树的根节点
	private TreeNode root;
	public TreeNode getRoot() {
		return root;
	}
	public void setRoot(TreeNode root) {
		this.root = root;
	}
	
	//无参构造函数
	Tree(){}
	
	Tree(int nodeValue){
		root = new TreeNode();
		TreeBean nodeBean = new TreeBean();  
        nodeBean.setNodeValue(nodeValue);
        root.setData(nodeBean);
	}
	/**
	 * 销毁树,将树置空。
	 * @author letthinking
	 * @param tree
	 * @return
	 */
	public static Tree destroy(Tree tree){
		return null;
	}
	/**
	 * 给树插入数据
	 * @author letthinking
	 * @param root
	 * @param node
	 */
	public void insert(TreeNode root,TreeNode node){
		//如果根节点为空,则赋值给根节点
		if(root == null){
			root = node;
		}else{
			//该节点与它的双亲节点比较,如果小于双亲节点,就将它作为左孩子,否则为右孩子。
			if(node.getData().getNodeValue() < root.getData().getNodeValue()){
				//判断该节点是否为空,如果不为空就继续递归。
				if(root.getLeftNode() == null){
					root.setLeftNode(node);
				}else{
					insert(root.getLeftNode(),node);
				}
			}else{
				if(root.getRightNode() == null){
					root.setRightNode(node);
				}else{
					insert(root.getRightNode(),node);
				}
			}
		}
	}
	
	/**
	 * 将树的所有节点清空
	 * @author letthinking
	 * @param root 树的根节点
	 */
	public void clearTree(TreeNode root){
		
		if(root.getData() == null){
			if(root.getLeftNode() != null){
				clearTree(root.getLeftNode());
			}
			if(root.getRightNode() != null){
				clearTree(root.getRightNode());
			}		
		}else{
			root.setData(null);
			if(root.getLeftNode() != null){
				clearTree(root.getLeftNode());
			}
			if(root.getRightNode() != null){
				clearTree(root.getRightNode());
			}	
		}
	}
	
	/**
	 * 前序遍历二叉树  
	 * @author letthinking
	 * @param root
	 * @return
	 */
	public String middleIterator(TreeNode root){
		StringBuilder str = new StringBuilder();
		//判断节点是否为空
		if(root == null){
			return str.toString();
		}else{
			//输出节点的值
			if(root.getData() != null){
				str.append(root.getData().getNodeValue()+",");
			}else{
				str.append("null,");
			}
			//递归输出左孩子的值
			str.append(middleIterator(root.getLeftNode()));
			//递归输出右孩子的值
			str.append(middleIterator(root.getRightNode()));
		}
		return str.toString();
	}
	
	/**
	 * 后序遍历二叉树  
	 * @author letthinking
	 * @param root
	 * @return
	 */
	public String afterIterator(TreeNode root){
		StringBuilder str = new StringBuilder();
		//判断节点是否为空
		if(root == null){
			return str.toString();
		}else{
			//递归输出左孩子的值
			str.append(afterIterator(root.getLeftNode()));
			//递归输出右孩子的值
			str.append(afterIterator(root.getRightNode()));
			//输出节点的值
			if(root.getData() != null){
				str.append(root.getData().getNodeValue()+",");
			}else{
				str.append("null,");
			}
		}
		return str.toString();
	}
	
	/**
	 * 求树的深度
	 * @author letthinking
	 * @param node
	 * @return
	 */
	public int treeDepth(TreeNode node){
		//定义两个变量用来存储左深度和右深度
		int leftDepth = 0;
		int rightDepth = 0;
		if(node == null){
			return 0;
		}else{
			leftDepth = treeDepth(node.getLeftNode())+1;
			rightDepth = treeDepth(node.getRightNode())+1;
		}
		//返回值最大的深度
		return leftDepth>=rightDepth?leftDepth:rightDepth;
	}
	
	public static void main(String [] args){
		
		//构造一个只有根节点的空树
		Tree tree = new Tree(35);
		//创建5个节点
		TreeNode treeNode = new TreeNode();
		treeNode.getData().setNodeValue(23);
		TreeNode treeNode1 = new TreeNode();
		treeNode1.getData().setNodeValue(56);
		TreeNode treeNode2 = new TreeNode();
		treeNode2.getData().setNodeValue(45);
		TreeNode treeNode3 = new TreeNode();
		treeNode3.getData().setNodeValue(12);
		TreeNode treeNode4 = new TreeNode();
		treeNode4.getData().setNodeValue(37);
		TreeNode treeNode5 = new TreeNode();
		treeNode5.getData().setNodeValue(19);
		//插入树中
		tree.insert(tree.root, treeNode);
		tree.insert(tree.root, treeNode1);
		tree.insert(tree.root, treeNode2);
		tree.insert(tree.root, treeNode3);
		tree.insert(tree.root, treeNode4);
		tree.insert(tree.root, treeNode5);
		//前序变量
		String result = tree.middleIterator(tree.getRoot());
		System.out.println(result);
		//后序序变量
		result = tree.afterIterator(tree.getRoot());
		System.out.println(result);
		//清空数所有节点的值
		tree.clearTree(tree.getRoot());
		result = tree.middleIterator(tree.getRoot());
		System.out.println(result);
		//得到树的深度
		System.out.println(tree.treeDepth(tree.getRoot())); 
	}
}
       可能会有地方写的不对,希望大家给指出。



 posted on 2011-10-02 23:41  SunnyYue  阅读(403)  评论(0编辑  收藏  举报