java实现二叉树的常见操作

       树型结构是最常见的非线性结构,其中二叉树最为常见。今天我主要就是用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())); 
	}
}
       可能会有地方写的不对,希望大家给指出。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树是一种非常常见的数据结构,它由一个根节点和最多两个子节点组成,每个子节点也可以再有两个子节点,以此类推。下面是一个使用Java实现二叉树的示例代码。 ```java public class Node { int data; Node left, right; public Node(int item) { data = item; left = right = null; } } public class BinaryTree { Node root; public BinaryTree(int key) { root = new Node(key); } public BinaryTree() { root = null; } public void insert(int key) { root = insert(root, key); } private Node insert(Node root, int key) { if (root == null) { root = new Node(key); return root; } if (key < root.data) root.left = insert(root.left, key); else if (key > root.data) root.right = insert(root.right, key); return root; } public void inorder() { inorder(root); } private void inorder(Node root) { if (root != null) { inorder(root.left); System.out.print(root.data + " "); inorder(root.right); } } public static void main(String[] args) { BinaryTree tree = new BinaryTree(); tree.insert(50); tree.insert(30); tree.insert(20); tree.insert(40); tree.insert(70); tree.insert(60); tree.insert(80); tree.inorder(); } } ``` 在这个示例中,我们定义了一个`Node`类表示二叉树的节点,包括一个整型数据`data`和左右子节点`left`和`right`。我们还定义了一个`BinaryTree`类表示二叉树,包括一个根节点`root`和一些操作方法,如插入节点`insert`和中序遍历`inorder`。 在`insert`方法中,我们使用递归来插入新的节点。如果当前节点为`null`,则创建一个新节点。否则,将新节点与当前节点进行比较,如果小于当前节点,则插入到左子树中,否则插入到右子树中。最后,返回当前节点。 在`inorder`方法中,我们使用递归来进行中序遍历,即先遍历左子树,再访问当前节点,最后遍历右子树。在主方法中,我们创建一个二叉树并插入一些节点,然后进行中序遍历输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值