java 实现二叉树构造、遍历、求平均值

本文详细介绍了二叉树的先根、中根、后根遍历算法,并提供了求二叉树节点平均值的方法及根据中根和后根序列构建二叉树的过程。通过实例演示了各种遍历方式及树的构建。

1.二叉树的先根,中根,后根遍历 

public class BinaryTree<T> {
public BinaryNode<T> root;
public BinaryTree(){
	this.root=null;
}
public BinaryNode<T> insert(T x){
	return this.root=new BinaryNode<T>(x,this.root,null);
}
public BinaryNode<T> insert(BinaryNode<T> parent,T x,boolean leftChild){
	if(x==null)
		return null;
	if(leftChild)
		return parent.left=new BinaryNode<T>(x,parent.left,null);
	return parent.right=new BinaryNode<T>(x,null,parent.right);
}
public void remove(BinaryNode<T> parent,boolean leftChild){
	if(leftChild)
		parent.left=null;
	else parent.right=null;
}
public void clear(){
	this.root=null;
}

public void preorder(){
	preorder(this.root);
	System.out.println();
}
private void preorder(BinaryNode<T> p){
	if(p!=null){
		System.out.print(p.data.toString()+" ");
		preorder(p.left);
		preorder(p.right);
	}
}

public String toString(){
	return toString(this.root);
}
private String toString(BinaryNode<T> p){
	if(p==null)
		return "^";
	return p.data.toString()+" "+toString(p.left)+toString(p.right);
}

public void inorder(){
	inorder(this.root);
	System.out.println();
}
private void inorder(BinaryNode<T> p){
	if(p!=null){
		inorder(p.left);
		System.out.print(p.data.toString()+" ");
		inorder(p.right);
	}
}

public void postorder(){
	postorder(this.root);
	System.out.println();
}
private void postorder(BinaryNode<T> p){
	if(p!=null){
		postorder(p.left);
		postorder(p.right);
		System.out.print(p.data.toString()+" ");
	}
}

public BinaryTree(T[] prelist){
	this.root=create(prelist);
}
private int i=0;
private BinaryNode<T> create(T[] prelist){
	BinaryNode<T> p=null;
	if(i<prelist.length){
		T elem=prelist[i];
		i++;
		if(elem!=null){
			p=new BinaryNode<T>(elem);
			p.left=create(prelist);
			p.right=create(prelist);
		}
	}
	return p;		
}
public static void main(String[] args){
	Integer[] prelist={1,2,3,4,5,6,7,8,9,10};
	BinaryTree<Integer> bitree=new BinaryTree<Integer>(prelist);
	System.out.println("先根次序遍历二叉树:"+bitree.toString());
	System.out.print("中根次序遍历二叉树:"); bitree.inorder();
	System.out.print("后根次序遍历二叉树:"); bitree.postorder();
}
}
class BinaryNode<T>{
	public T data;
	public BinaryNode<T> left,right;
	public BinaryNode(T data,BinaryNode<T> left,BinaryNode<T> right){
		this.data=data;
		this.left=left;
		this.right=right;
	}
	public BinaryNode(T data){//构造元素为data的叶子结点
		this(data, null, null);
	}
	public String toString(){
		return this.data.toString();
	}
	public boolean isLeaf(){
		return this.left==null&&this.right==null;
	}
}

 


2.求一棵BinaryTree<Integer>二叉树中各结点数值的平均值 

public class BinaryTree<T> { 
public BinaryNode<T> root;
public BinaryTree(){
	this.root=null;
}
public void preorder(){
	preorder(this.root);
	System.out.println();
}
private void preorder(BinaryNode<T> p){
	if(p!=null){
		System.out.print(p.data.toString()+" ");
		preorder(p.left);
		preorder(p.right);
	}
}

public String toString(){
	return toString(this.root);
}
private String toString(BinaryNode<T> p){
	if(p==null)
		return "^";
	return p.data.toString()+" "+toString(p.left)+toString(p.right);
}

private double sum=0;
private double n=0;
public void average(){
	count(this.root);
	double res=sum/n;
	System.out.println("各结点数值的平均值为:"+res);
}
public void count(BinaryNode<T> p){
	if(p!=null){
		n++;
		count(p.left);
		count(p.right);
		sum+=(int) p.data;
	}
}
public BinaryTree(T[] prelist){
	this.root=create(prelist);
}
private int i=0;
private BinaryNode<T> create(T[] prelist){
	BinaryNode<T> p=null;
	if(i<prelist.length){
		T elem=prelist[i];
		i++;
		if(elem!=null){
			p=new BinaryNode<T>(elem);
			p.left=create(prelist);
			p.right=create(prelist);
		}
	}
	return p;		
}
public static void main(String[] args){
	Integer[] prelist={1,2,3,null,4,null,null,null,5,6,null,null,7,8};
	BinaryTree<Integer> bitree=new BinaryTree<Integer>(prelist);
	System.out.println("先根次序遍历二叉树:"+bitree.toString());
	bitree.average();
}
}
class BinaryNode<T>{
	public T data;
	public BinaryNode<T> left,right;
	public BinaryNode(T data,BinaryNode<T> left,BinaryNode<T> right){
		this.data=data;
		this.left=left;
		this.right=right;
	}
	public BinaryNode(T data){//构造元素为data的叶子结点
		this(data, null, null);
	}
	public String toString(){
		return this.data.toString();
	}
	public boolean isLeaf(){
		return this.left==null&&this.right==null;
	}
}

 


 

3.由中根和后根次序遍历序列构造二叉树。 


public class BinaryTree<T> { 
	public BinaryNode<T> root;

	public BinaryTree() {
		this.root = null;
	}

	public void preorder() {
		preorder(this.root);
		System.out.println();
	}

	private void preorder(BinaryNode<T> p) {
		if (p != null) {
			System.out.print(p.data.toString() + " ");
			preorder(p.left);
			preorder(p.right);
		}
	}

	public String toString() {
		return toString(this.root);
	}

	private String toString(BinaryNode<T> p) {
		if (p == null)
			return "^";
		return p.data.toString() + " " + toString(p.left) + toString(p.right);
	}

	
	public BinaryTree(T[] inlist, T[] postlist) {
		this.root = create(inlist, postlist, postlist.length - 1, 0, inlist.length);
	}

	private BinaryNode<T> create(T[] inlist, T[] postlist, int poststart, int instart, int n) {
		if (n <= 0)
			return null;
		T elem = postlist[poststart];
		BinaryNode<T> p = new BinaryNode<T>(elem);
		int i = 0;
		while (i < n && !elem.equals(inlist[instart + i])) {
			i++;
		}
		p.left = create(inlist, postlist, poststart - n+i, instart, i);
		p.right = create(inlist, postlist, poststart - 1, instart + i + 1, n - i - 1);

		return p;
	}



	public static void main(String[] args) {
		String[] inlist = { "D", "G", "B", "A", "E", "C", "H", "F" };
		String[] postlist = { "G", "D", "B", "E", "H", "F", "C", "A" };
		BinaryTree<String> bitree = new BinaryTree<String>(inlist, postlist);
		System.out.println("先根次序遍历二叉树:" + bitree.toString());

	}
}

class BinaryNode<T> {
	public T data;
	public BinaryNode<T> left, right;

	public BinaryNode(T data, BinaryNode<T> left, BinaryNode<T> right) {
		this.data = data;
		this.left = left;
		this.right = right;
	}

	public BinaryNode(T data) {// 构造元素为data的叶子结点
		this(data, null, null);
	}

	public String toString() {
		return this.data.toString();
	}

	/*public boolean isLeaf() {
		return this.left == null && this.right == null;
	}*/
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值