二叉排序树 常用函数小结

所实现的功能为
insert 插入
del 删除
find 查找
getMin 查找最小值
getMax 查找最大值
size 结点总个数
getHeight 树的高度
inorder 中序遍历
[前序遍历和后序遍历请看我之前文章] 144. 二叉树的前序迭代遍历推出后序,中序以及层序的实现
printleaves 打印叶子结点
onelevelnum 打印树的每一层结点
kthlargest 树的第k最大值
suojin 缩进打印树

所有的功能对应大部分至少两种方法

BitreeNode 类 代码如下

package BST;

class BiTreeNode {
	public BiTreeNode lchild, rchild;
	public int data;


	public BiTreeNode(int data) {
		this.data=data;	
	}

	public BiTreeNode() {
		lchild=rchild=null;
		data=0;
	}

	@Override
	public String toString() {
		return "BiTreeNode [data=" + data + "]";
	}

	public BiTreeNode(BiTreeNode lchild, BiTreeNode rchild, int data) {
		this.lchild = lchild;
		this.rchild = rchild;
		this.data = data;
	}
	
}

BiSearchTree 类 代码如下

package BST;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class BiSearchTree {
	public BiTreeNode root;
	int m = 0;
	int n;

	public BiSearchTree() {
		root = null;
	}

	public void insert(int x) {

		if (root == null) {
			root = new BiTreeNode(x);
			return;
		}
		BiTreeNode p = root;
		while (p != null) {
			if (x > p.data) {

				if (p.rchild == null) {
					p.rchild = new BiTreeNode(x);
					return;
				}
				p = p.rchild;

			} else {
				if (p.lchild == null) {
					p.lchild = new BiTreeNode(x);
					return;
				}
				p = p.lchild;

			}

		}
	}

	public BiTreeNode insert2(BiTreeNode p, int x) {
		if (root == null) {
			root = new BiTreeNode(x);
		}
		if (p == null) {
			p = new BiTreeNode(x);
			return p;
		} else {
			if (x > p.data) {
				p.rchild = insert2(p.rchild, x);

			} else if (x < p.data) {
				p.lchild = insert2(p.lchild, x);

			}
			return p;
		}
	}

	public void del1(int x) {
		BiTreeNode p = root;
		BiTreeNode parent = p;
		while (p != null && p.data != x) {
			parent = p;
			if (x > p.data) {
				p = p.rchild;
			} else {
				p = p.lchild;
			}
		}
		if (p == null) {
			System.out.println("error");
			return;
		} else if (p.data == x) {
			if (p.lchild != null && p.rchild != null) {
				BiTreeNode temp = p;
				BiTreeNode parent2 = temp;
				temp = p.lchild;
				p.data = getMax2(temp).data;
				while (temp.rchild != null) {
					parent2 = temp;
					temp = temp.rchild;
				}
				if (temp.lchild == null) {
					if (parent2.lchild == temp) {
						parent2.lchild = null;
					} else {
						parent2.rchild = null;
					}

				} else {
					if (parent2.lchild == temp) {
						parent2.lchild = temp.lchild;
					} else {
						parent2.rchild = temp.lchild;
					}

				}

			} else {
				BiTreeNode child;
				if (p.lchild != null) {
					child = p.lchild;
				} else if (p.rchild != null) {
					child = p.rchild;
				} else {
					child = null;
				}

				if (parent.lchild == p) {
					parent.lchild = child;
				} else if (parent.rchild == p) {
					parent.rchild = child;
				} else {
					root = child;
				}

			}

		}
	}

	public BiTreeNode del2(BiTreeNode p, int x) {
		if (p == null) {
			System.out.println("empty error");
			return p;
		}
		if (x < p.data) {
			p.lchild = del2(p.lchild, x);
		} else if (x > p.data) {
			p.rchild = del2(p.rchild, x);
		} else {
			if (p.lchild != null && p.rchild != null) {
				BiTreeNode temp = p.lchild;
				p.data = getMax2(temp).data;
				p.lchild = del2(p.lchild, p.data);
			} else if (p.lchild == null) {
				p = p.rchild;
			} else if (p.rchild == null) {
				p = p.lchild;
			}
		}
		root = p;
		return p;
	}

	public void del3(int x) {
		BiTreeNode p = root;
		BiTreeNode parent = p;
		while (p != null && p.data != x) {
			parent = p;
			if (x < p.data) {
				p = p.lchild;
			} else if (x > p.data) {
				p = p.rchild;
			}

		}
		if (p == null) {
			return;
		} else {
			if (p.lchild != null && p.rchild != null) {
				BiTreeNode temp = p.lchild;
				if (parent.lchild == p) {
					parent.lchild = temp;
				} else if (parent.rchild == p) {
					parent.rchild = temp;
				} else {
					if (p.lchild != null) {
						root = p.lchild;
					} else if (p.rchild != null) {
						root = p.rchild;
					}
				}
				getMax2(temp).rchild = p.rchild;

			} else {
				BiTreeNode child = null;
				if (p.lchild != null) {
					child = p.lchild;
				} else if (p.rchild != null) {
					child = p.rchild;
				}
				if (parent.lchild == p) {
					parent.lchild = child;
				} else if (parent.rchild == p) {
					parent.rchild = child;
				} else {
					root = child;
				}
			}
		}

	}

	public BiTreeNode del4(BiTreeNode p, int x) {
		if (p == null) {
			return p;
		}

		if (x < p.data) {
			p.lchild = del4(p.lchild, x);
		} else if (x > p.data) {
			p.rchild = del4(p.rchild, x);
		} else {
			if (p.lchild != null && p.rchild != null) {
				BiTreeNode temp = getMax2(p.lchild);
				temp.rchild = p.rchild;
				p = p.lchild;

			} else if (p.lchild == null) {
				p = p.rchild;
			} else if (p.rchild == null) {
				p = p.lchild;
			}
		}
		root = p;
		return p;
	}

	public BiTreeNode find(int x) {
		BiTreeNode p = root;
		if (p == null) {
			System.out.println("empty error");
			return p;
		}
		while (p != null) {
			if (x > p.data) {
				p = p.rchild;
			} else if (x < p.data) {
				p = p.lchild;
			} else {
				return p;
			}
		}
		return null;

	}

	public BiTreeNode find2(BiTreeNode p, int x) {
		if (p == null) {
			System.out.println("empty error");
			return p;
		}
		if (x > p.data) {
			return find2(p.rchild, x);
		} else if (x < p.data) {
			return find2(p.lchild, x);
		} else {
			if (x == p.data) {
				return p;
			} else {
				return null;
			}

		}

	}

	public BiTreeNode getMin() {
		if (root == null) {
			return null;
		}
		BiTreeNode p = root;
		while (p.lchild != null) {
			p = p.lchild;
		}
		return p;
	}

	public BiTreeNode getMin2(BiTreeNode p) {
		if (p == null) {
			System.out.println("error p结点data为空");
			return null;
		}
		if (p.lchild == null) {
			return p;
		}

		return getMin2(p.lchild);
	}

	public BiTreeNode getMax() {
		if (root == null) {
			return null;
		}
		BiTreeNode p = root;
		while (p.rchild != null) {
			p = p.rchild;
		}
		return p;
	}

	public BiTreeNode getMax2(BiTreeNode p) {
		if (p == null) {
			System.out.println("error p结点data为空");
			return null;
		}
		if (p.rchild == null) {
			return p;
		}
		return getMax2(p.rchild);
	}

	public int size() {
		return size(root);
	}

	public int size(BiTreeNode p) {
		if (p == null) {
			return 0;
		}
		return 1 + size(p.lchild) + size(p.rchild);

	}
	public void size2(BiTreeNode p) {
		int num=1;
		Queue<BiTreeNode> queue = new LinkedList<BiTreeNode>();
		queue.add(p);
		while(!queue.isEmpty()) {
			BiTreeNode temp=queue.poll();
			if(temp.lchild!=null) {
				queue.add(temp.lchild);
				num++;
			}
			if(temp.rchild!=null) {
				queue.add(temp.rchild);
				num++;
			}
		}
		System.out.println(num);
	}
	public int getHeight() {
		return getHeight(root);
	}

	public int getHeight(BiTreeNode p) {
		if (p == null) {
			return 0;
		}
		return getHeight(p.lchild) > getHeight(p.rchild) ? getHeight(p.lchild) + 1 : getHeight(p.rchild) + 1;

	}
	public int getHeight2() {
		return getHeight2(root);
	}
	public int getHeight2(BiTreeNode p) {
		int height=0;
		Queue<BiTreeNode> queue = new LinkedList<BiTreeNode>();
		queue.add(p);
		while(!queue.isEmpty()) {
			int n=queue.size();
			for(int i=0;i<n;i++) {
				BiTreeNode temp=queue.poll();
				if(temp.lchild!=null) {
					queue.add(temp.lchild);
				}
				if(temp.rchild!=null) {
					queue.add(temp.rchild);
				}	
			}
			height++;
			
		}
		return height;
	}
	public int inorder(BiTreeNode p) {
		if (p == null) {
			return -1;
		}
		inorder(p.lchild);
		System.out.print(p.data + " ");
		inorder(p.rchild);
		return 1;
	}

	public int inorder() {
		return inorder(root);
	}

	public LinkedList<Integer> inorder2() {
		if (root == null) {
			return null;
		}
		BiTreeNode p = root;
		LinkedList<Integer> list = new LinkedList<Integer>();
		Stack<BiTreeNode> stack = new Stack<BiTreeNode>();
		while (p != null || !stack.isEmpty()) {
			if (p != null) {
				stack.push(p);
				p = p.lchild;
			} else {
				p = stack.pop();
				list.addLast(p.data);
				p = p.rchild;

			}
		}
		System.out.println(list.toString());
		return list;
	}
	
	public void OneLevelnum(int xlevel) {
		BiTreeNode p=root;
		int height=0;
		Queue<BiTreeNode> queue = new LinkedList<BiTreeNode>();
		queue.add(p);
		while(!queue.isEmpty()) {
			int n=queue.size();
			if(++height==xlevel) {
				for(int i=0;i<n;i++) {		
					System.out.print(queue.poll()+" ");
				}
				break;
			}
			for(int i=0;i<n;i++) {
				BiTreeNode temp=queue.poll();
				if(temp.lchild!=null) {
					queue.add(temp.lchild);
				}
				if(temp.rchild!=null) {
					queue.add(temp.rchild);
				}	
			}
			
			
		}
	
	}
	public void printleaves(BiTreeNode p) {
		if (p == null)
			return;
		if (p.lchild == null && p.rchild == null) {
			System.out.print(p + " ");
		} else {
			printleaves(p.lchild);
			printleaves(p.rchild);
		}
	}
	public void printleaves2(BiTreeNode p) {
		int height=getHeight();
		OneLevelnum(height);
	}
	public void suojin() {
		suojin(root, 1);
	}

	public void suojin(BiTreeNode p, int i) {
		if (p == null)
			return;
		else {
			for (int j = 0; j < i; j++) {
				System.out.print("-");
			}
			System.out.println(p.data);
			suojin(p.lchild, ++i);
			i--;
			suojin(p.rchild, ++i);
			i--;
		}

	}

	public int kthLargest(BiTreeNode p, int k) {
		if (p == null) {
			return -1;
		}
		kthLargest(p.rchild, k);
		m++;
		if (k == m) {
			n = p.data;
			return p.data;
		}

		kthLargest(p.lchild, k);
		return n;
	}

}

原文地址:https://www.cnblogs.com/nmydt/p/14256363.html