Java实现二叉树创建及便遍历

/**
 * 二叉树是数据元素间具有层次关系的非线性结构,而且二叉树每个结点的两个子树有
 * 左右之分。
 * 对于给定的一棵二叉树,其先序/中序/后序遍历是唯一确定的,但给定一种遍历,无法
 * 确定一棵二叉树。先序/后序反应父结点与孩子结点层次关系,中序反应兄弟结点间左右次序
 * */
public class BinaryTree {//二叉树是有序树,每个结点的两棵子树有左、右之分
	TreeNode root;//根结点
	private int size = 0;//树的大小
	public BinaryTree() {//无参构造
	
	}
	/*有序树求得最大值-最小值*/
	public int getMax() {
		TreeNode node = root;
		while ( node.rightChild!=null) {
			node = node.rightChild;
		}
		return node.value;
	}
	public int getMin() {
		TreeNode node = root;
		while ( node.leftChild!=null) {
			node = node.leftChild;
		}
		return node.value;
	}
	/*得到二叉树大小*/
	public int getSize() {
		return this.size;
	}
	/*生成二叉树*/
	public void createBinaryTree( int [] data) {//传入无序数组构造二叉树
		for ( int i: data) {
			insertTree(i);
		}
	}
	public void insertTree( int data ) {//插入结点
		if( root == null ) {//如果没有根结点首先插入根结点
			root = new TreeNode(data);
		} else {//判断传入的值和左右子树关系
			TreeNode cur = root;
			TreeNode parent;
			while ( true ) {//while(true)这个循环来找到目标插入位置
				parent = cur;
				if ( data < cur.value ) {
					cur = parent.leftChild;//一直到左结点为叶子结点
					if( cur == null ) {
						parent.leftChild = new TreeNode(data);
						break;
					}
				} else {
					cur = parent.rightChild;//一直到左结点为叶子结点
					if( cur == null ) {
						parent.rightChild = new TreeNode(data);
						break;
					}
				}
			}			
		}
		size++;
	}
	/*先序递归遍历*/
	public void preOrder(TreeNode node ) {
		if( node == null ) {//终止递归条件
			return;
		}
		System.out.print( node.value + "--");
		preOrder(node.leftChild );
		preOrder(node.rightChild);
	}
	/*中序递归遍历*/
	public void midOrder(TreeNode node ) {
		if( node == null ) {//终止递归条件
			return;
		}		
		midOrder(node.leftChild );
		System.out.print( node.value + "--");
		midOrder(node.rightChild);
	}
	/*后序递归遍历*/
	public void postOrder(TreeNode node ) {
		if( node == null ) {//终止递归条件
			return;
		}		
		postOrder(node.leftChild );
		postOrder(node.rightChild);
		System.out.print( node.value + "--");
	}
	/*查找*/
	public boolean search( int data ) {
		boolean result = false;
		TreeNode node = root;
		while( true ) {
			if ( data == node.value) {
				result = true;
				break;
			} else if ( data < node.value ) {
				node = node.leftChild;
				if( node == null ) {
					break;
				}
			} else {
				node = node.rightChild;
				if( node == null ) {
					break;
				}
			}			
		}
		return result;
	}
}
class TreeNode{
	TreeNode leftChild;
	TreeNode rightChild;
	int value;
	public TreeNode(int data) {//构造有值结点
		this.value = data;
		leftChild = null;
		rightChild = null;
	}
}

测试结果:

<pre name="code" class="java">public class BinaryTreeTest {
	public static void main(String[] args) {
		BinaryTree tree = new BinaryTree();
		int []data = {2,4,6,1,3,9,11,8,7};
		tree.createBinaryTree(data);
		System.out.println("先序遍历:");
		tree.preOrder(tree.root);
		System.out.println();	
		System.out.println("中序遍历:");
		tree.midOrder(tree.root);
		System.out.println();	
		System.out.println("后序遍历:");
		tree.postOrder(tree.root);
		System.out.println();
		System.out.println("查找结果:");		
		System.out.println(tree.search(16)==false?"不存在":"存在");
	}
}
控制台输出:

 

先序遍历:
2--1--4--3--6--9--8--7--11--
中序遍历:
1--2--3--4--6--7--8--9--11--
后序遍历:
1--3--7--8--11--9--6--4--2--
查找结果:
不存在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值