用java实现二叉树

用java实现二叉树

二叉树的基础知识

  1. 先序遍历(DLR)

1)访问根节点。
2)按先序遍历访问左子树。
3)按先序遍历访问右子树。

  1. 中序遍历(LRD)

1)按中序遍历左子树。
2)访问根节点。
3)按中序遍历访问右子树。

  1. 后序遍历

1)按后序遍历访问左子树。
2)按后序遍历访问右子树。

代码实现

package qcby.binarytree;

public class binaryTree {

	private Node rootNode = new Node();
	private Node preNode;

	public void add(Integer data) {
		add(data, rootNode);
	}

	public void del(Integer data) {
		Node find = find(data);
		if (find == null) {// �]���ҵ�
			System.out.println("�]���ҵ�");
			return;
		} else {
			if (find.getLeft() == null && find.getRight() == null) {// �h������Ҷ�ӽڵ�
				if (preNode.getRight().equals(find)) {
					preNode.setRight(null);
				} else {
					preNode.setLeft(null);
				}
			} else if (find.getLeft() != null) {// ���������
				Node temp = find.getLeft();
				Node parent = find;
				while (temp.getRight() != null) {
					parent = temp;
					temp = temp.getRight();
				}
				find.setData(temp.getData());
				if (parent.equals(find)) {
					parent.setLeft(temp.getLeft());
				} else {
					parent.setRight(temp.getLeft());
				}
				temp.setLeft(null);// ��һ��д��д���������������.hotspot
			} else {// ���ұ���С��
				Node temp = find.getRight();
				Node parent = find;
				while (temp.getLeft() != null) {
					parent = temp;
					temp = temp.getLeft();
				}
				find.setData(temp.getData());
				if (parent.equals(find)) {
					parent.setRight(temp.getRight());

				} else {

					parent.setLeft(temp.getRight());

				}

				temp.setRight(null);// ��һ��д��д���������������.hotspot
			}
		}
	}

	public Node find(Integer data) {
		return find(data, rootNode);
	}

	@Override
	public String toString() {
		return "BinaryTree [Node=" + rootNode + "]";
	}

	/**
	 * 
	 * @param data
	 * @param node
	 */
	private void add(Integer data, Node node) {
		if (node.getData() == null) {
			node.setData(data);
			return;
		} else if (node.getData().compareTo(data) == 0) {
			System.err.println(data + "�ַ����Ѿ��ڲ��Ҷ�������");
		} else if (node.getData().compareTo(data) > 0) {// ��������
			if (node.getLeft() == null) {
				node.setLeft(new Node());
			}
			add(data, node.getLeft());
		} else {// ��������
			if (node.getRight() == null) {
				node.setRight(new Node());
			}
			add(data, node.getRight());
		}
	}

	// ����
	// ��ѯ
	private Node find(Integer data, Node node) {
		if (node == null) {
			return null;
		}
		if (node.getData().equals(data)) {// �_����Ҫ���ҵ��@�����c

			return node;
		} else if (node.getData().compareTo(data) > 0) {// �M�����
			preNode = node;
			return find(data, node.getLeft());
		} else {
			preNode = node;
			return find(data, node.getRight());
		}
	}

	public static void main(String[] args) {
		binaryTree a = new binaryTree();
		a.add(50);
		a.add(40);
		a.add(30);
		a.add(20);
		a.add(35);
		a.add(45);
		a.add(42);
		a.add(47);
		a.add(60);
		a.add(55);
		a.add(70);
		a.add(100);
		System.err.println(a);
		a.del(50);
		System.err.println(a);
	}
}
package qcby.binarytree;

public class Node {
	private Integer data;
	private Node left;
	private Node right;

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

	public Integer getData() {
		return data;
	}
	public void setLeft(Node left) {
		this.left = left;
	}
	
	public Node getLeft() {
		return left;
	}
	public void setRight(Node right) {
		this.right = right;
	}
	
	public Node getRight() {
		return right;
	}

	@Override
	public String toString() {
		return "Node [data=" + data + ", left=" + left + ", right=" + right + "]";
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值