import java.util.Stack;
class Node{
int data;
Node left;
Node right;
public Node(int data) {
this.data = data;
}
}
public class BinarySortTree {
Node root;
//添加节点
public void add(int value) {
this.add(value, this.root);
}
public void add(int value, Node node) {
if(this.root == null) {
this.root = new Node(value);
}else {
//大于放在右边
if(value > node.data) {
if(node.right == null) {
node.right = new Node(value);
}else {
add(value, node.right);
}
}else {//小于等于放在左边
if(node.left == null) {
node.left = new Node(value);
}else {
add(value, node.left);
}
}
}
}
//非递归中序遍历,正好是从小到大
public void inOrder() {
Node temp = this.root;
Stack<Node> stack = new Stack<Node>();
while(!stack.isEmpty() || temp != null) {
if(temp != null) {
stack.push(temp);
temp = temp.left;
}else {
temp = stack.pop();
System.out.print(temp.data + " ");
temp = temp.right;
}
}
}
//删除节点
public void delNode(int value) {
Node target = search(value);
if(target == null) {
System.out.println("BinarySortTree does not have this Node!");
return;
}else {
Node parent = searchParent(value);
//1,如果target是叶子节点
if(target.left == null && target.right == null) {
//如果target是根节点
if(parent == null) {
this.root =null;
}else {
//如果target是parent的左子节点
if(parent.left != null && parent.left.data == value) {
parent.left = null;
}else {//否则一定是右子节点
parent.right = null;
}
}
//2,如果target左子节点为空,右子节点不为空
}else if(target.left == null && target.right != null){
//如果target是根节点
if(parent == null) {
this.root = target.right;
//如果target是parent的左子节点
}else if(parent.left != null && parent.left.data == value){
parent.left = target.right;
}else {
parent.right = target.right;
}
//3,如果target右子节点为空,左子节点不为空
}else if(target.left != null && target.right == null) {
//如果target是根节点
if(parent == null) {
this.root = target.left;
//如果target是parent的左子节点
}else if(parent.left != null && parent.left.data == value){
parent.left = target.left;
}else {
parent.right = target.left;
}
//4,如果如果左右子节点均不为空,找到左子树的最大值k(或者右子树的最小值),删除k的节点,用k代替target的值
}else {
Node temp = target.left;
//找到左子树的最大值,这里不需要讨论target是否为root
while(temp.right != null) {
temp = temp.right;
}
int k = temp.data;
delNode(k);
target.data = k;
}
}
}
//查找值位value的节点
public Node search(int value) {
return search(value, root);
}
public Node search(int value, Node node) {
if(node == null) {
return null;
}else {
if(node.data == value) {
return node;
}else if(value > node.data) {
return search(value, node.right);
}else {
return search(value, node.left);
}
}
}
//查找值位value的节点的父节点
public Node searchParent(int value) {
if(this.root.data == value) {
return null;
}else {
return searchParent(value, this.root);
}
}
public Node searchParent(int value, Node node) {
if((node.left != null && node.left.data == value) || (node.right != null && node.right.data == value)){
return node;
}else if(node.right != null && value > node.data) {
return searchParent(value, node.right);
}else if(node.left != null && value <= node.data) {
return searchParent(value, node.left);
}else {
return null;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {7,3,10,12,5,1,9};
BinarySortTree bst = new BinarySortTree();
for(int i=0; i<arr.length; i++) {
bst.add(arr[i]);
}
bst.inOrder();
System.out.println();
bst.delNode(7);
bst.inOrder();
}
}
// 7
// 3 10
// 1 5 9 12
Java实现二叉排序树
最新推荐文章于 2021-10-11 09:45:01 发布