数据结构之树(三)二叉树

1.二叉树接口

public interface BinaryTreeInterface<T>  {
     public T getRootData();
     public int  getHeight();
     public int getNumberOfRoot();
     public void clear();
    
     public void setTree(T rootData);  // 用rootData设置树
    public void setTree(T rootData,BinaryTreeInterface<T> left,BinaryTreeInterface<T> right);  //设置树,用左右子节点
    }


2.节点类

package com.jimmy.impl;

public class BinaryNode<T> {
	private T data;
	private BinaryNode<T> left; // 左子节点
	private BinaryNode<T> right; // 右子节点

	public BinaryNode() {
		this(null);
	}

	public BinaryNode(T data) {
		this(data, null, null);
	}

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

	public T getData() {
		return data;
	}

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

	public BinaryNode<T> getLeft() {
		return left;
	}

	public void setLeft(BinaryNode<T> left) {
		this.left = left;
	}

	public BinaryNode<T> getRight() {
		return right;
	}

	public void setRight(BinaryNode<T> right) {
		this.right = right;
	}

	public boolean hasLeft() {
		return left != null;

	}

	public boolean hasRight() {
		return right != null;

	}

	public boolean isLeaf() {
		return (left == null) && (right == null);

package com.jimmy.impl;

import java.util.Stack;

import com.jimmy.BinaryTreeInterface;

public class Binarytree<T> implements BinaryTreeInterface<T> {

	private BinaryNode<T> root; // 只要一个数据节点就够了

	// 构造空树

	public Binarytree() {
		root = null;
	}

	// 用rootData构造树(有个根)
	public Binarytree(T rootdata) {
		root = new BinaryNode<T>(rootdata);
	}

	// 用其他树构造树
	public Binarytree(T rootdata, Binarytree<T> leftTree,
			Binarytree<T> rightTree) {
		root = new BinaryNode<T>(rootdata);
		if (leftTree != null) {
			root.setLeft(leftTree.root);
		}

		if (rightTree != null) {
			root.setRight(rightTree.root);
		}
	}

	// 用rootData设置树(有个根)
	@Override
	public void setTree(T rootData) {
		root = new BinaryNode<T>(rootData);

	}

	// 用其他树设置树
	public void setTree(T rootData, BinaryTreeInterface<T> left,
			BinaryTreeInterface<T> right) {
		root = new BinaryNode<T>(rootData);
		Binarytree leftTree = null;
		Binarytree rightTree = null;
		if ((leftTree = (Binarytree) left) != null) {
			root.setLeft(leftTree.root);
		}

		if ((rightTree = (Binarytree) right) != null) {
			root.setRight(rightTree.root);
		}
	}

	@Override
	public void clear() {
		root = null;
	}

	@Override
	public int getHeight() {
		// TODO Auto-generated method stub
		return root.getHeight();
	}

	@Override
	public int getNumberOfRoot() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public T getRootData() {
		if (root != null)
			return root.getData();
		else
			return null;
	}

	public BinaryNode<T> getRoot() {
		return root;
	}

	public void setRoot(BinaryNode<T> root) {
		this.root = root;
	}

	public int getNumOfNodes() {
		return root.getNumOfNodes();
	}

	public void inOrderTraverse() {

		inOrderTraverse(root);
	}

	// 用栈方法遍历
	public void inOrderStackTraverse() {

		Stack<BinaryNode> stack = new Stack<BinaryNode>();
		BinaryNode cur = root;
		// stack.push(root);
		while (!stack.isEmpty() || (cur != null)) {
			while (cur != null) {

				stack.push(cur);
				cur = cur.getLeft();

			}
			if (!stack.isEmpty()) {
				BinaryNode tmp = stack.pop();
				if (tmp != null) {
					System.out.println(tmp.getData());
					cur = tmp.getRight();

				}

			}
		}
	}

	// 递归遍历
	public void inOrderTraverse(BinaryNode<T> node) {

		if (node != null) {
			inOrderTraverse(node.getLeft());
			System.out.println(node.getData());

			inOrderTraverse(node.getRight());
		}
	}

	public static void main(String[] args) {
		Binarytree<String> t = new Binarytree<String>();
		Binarytree<String> t8 = new Binarytree<String>("8");
		Binarytree<String> t7 = new Binarytree<String>("7");
		t.setTree("6", t7, t8); // 用t7,t8设置树t

		t.inOrderStackTraverse();
		System.out.println(t.getHeight());
	}
}

}public int getHeight() {return getHeight(this);}public int getHeight(BinaryNode<T> node) {int h = 0;if (node != null)h = 1 + Math.max(node.getHeight(node.left), node.getHeight(node.right));return h;}public int getNumOfNodes() {int lnum = 0, rnum = 0;if (left != null)lnum = left.getNumOfNodes();if (right != null)rnum = right.getNumOfNodes();return lnum + rnum + 1;}}


3.二叉树实现

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值