二叉树的基础知识
- 先序遍历(DLR)
1)访问根节点。
2)按先序遍历访问左子树。
3)按先序遍历访问右子树。
- 中序遍历(LRD)
1)按中序遍历左子树。
2)访问根节点。
3)按中序遍历访问右子树。
- 后序遍历
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 + "]";
}
}