二叉树的存储和构造例子

二叉树通常采用链式存储结构,每个结点至少要有两条链分别连接左孩子和右孩子。其中,二叉链表采用两条链连接孩子,每个结点有三个域:data存储数据,left,right分别指向左孩子和右孩子。下面是用JAVA写的一个例子,实现了二叉链表结构和遍历方法。

/*
 * 二叉树的二叉链表结点
 */
public class BinaryNode<E> {
	public E data;
	public BinaryNode<E>left,right;
	//构造结点,指定元素和左右孩子结点
	public BinaryNode(E data,BinaryNode<E>left,BinaryNode<E>right){
		this.data=data;
		this.left=left;
		this.right=right;
	}
	public BinaryNode(E data){
		this(data,null,null);//构造有值的叶子结点
	}
	public BinaryNode(){
		this(null,null,null);//空结点
	}
	public boolean isLeaf(){
		return this.left==null && this.right==null;
	}
	public String toString(){
		return this.data.toString();
	}

}

/*
 * 二叉树的构造
 */
public class BinaryTree<E> {
	protected BinaryNode<E> root;
	public BinaryTree(){	//构造空二叉树
		root=null;
	}
	public BinaryTree(BinaryNode<E>root){
		this.root=root;	//构造指定根节点的二叉树
	}
	public boolean isEmpty(){
		return this.root==null;
	}
	public BinaryNode<E>getRoot(){
		return this.root;	//返回二叉树的根节点
	}
	//前序遍历
	public void preOrder(){		
		System.out.print("前序遍历");
		preOrder(root);
	}
	private void preOrder(BinaryNode<E>p){
		if(p!=null){
			System.out.print(p.data+" ");
			preOrder(p.left);
			preOrder(p.right);
		}
	}
	//中序遍历
	public void inOrder(){
		System.out.println("中序遍历");
		inOrder(root);
	}
	private void inOrder(BinaryNode<E>p){
		if(p!=null){
			inOrder(p.left);
			System.out.print(p.data+" ");
			inOrder(p.right);
			
		}
	}
	//后序遍历
	public void lastOrder(){
		System.out.print("后序遍历");
		lastOrder(root);
	}
	private void lastOrder(BinaryNode<E>p){
		if(p!=null){
			lastOrder(p.left);
			lastOrder(p.right);
			System.out.print(p.data+" ");
		}
	}

}

/*
 * 构造一个二叉树并且用前序遍历和中序遍历,后序遍历。
 */
public class Traverse {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BinaryTree<String> bitree=create();
		bitree.preOrder();
		bitree.inOrder();
		bitree.lastOrder();

	}
	/*
	 * 构造一个二叉树
	 *  	 A
	 *  B	       C 
	 *D 	    E	   F
	 *   G	         H
	 *  
	 */
	 
	public static BinaryTree<String> create(){
		BinaryNode<String> child_a,child_b,child_c,child_d,child_f;
		child_d=new BinaryNode<String>("D",null,new BinaryNode("G"));
		child_b=new BinaryNode<String>("B",child_d,null);
		child_f=new BinaryNode<String>("F",new BinaryNode("H"),null);
		child_c=new BinaryNode<String>("C",new BinaryNode("E"),child_f);
		child_a=new BinaryNode<String>("A",child_b,child_c);
		return new BinaryTree<String>(child_a);
		
	}

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值