1. 节点:
public void Node(){
private Object value;
private Node left;
private Node right;
}
2.建立二叉排序(搜索)树(插入): 递归传递当前root以及要插入的节点。直到root为null时插入
public void insert(Node root,Node newNode){
if(root == null){
root = newNode;
return;
}
if(newNode.value<root.value){
insert(root.left,newNode);
}else{
insert(root.right,newNode);
}
}
3. 遍历:
1) 先中后序遍历的先中后是指中间结点的遍历位置,儿子节点都是先左后右。代码传递当前根节点,只是打印的顺序不一样
a. 先序: 中左右
b. 中序: 左中右
c. 后序: 左右中
public void preOrder_scan(Node root){
if(root!=null){
System.out.println(root.value);
preOrder_scan(root.left);
preOrder_scan(root.right);
}
}
2) 层次遍历: 用queue保证子节点输出顺序在兄弟节点之后先进先出;队列的顺序是 兄弟节点-儿子节点。压节点时先左后右
public void levelOrder_scan(Node root){
ArrayDeque<Node> queue = new ArrayDeque();
queue.add(root);
while(!queue.isEmpty()){
Node node = queue.remove();
System.out.println(node.value);
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
}
public void deepOrder_scan(Node root){
Stack <Node> stack = new Stack ();
stack.push(root);
while(!stack.isEmpty()){
Node node = queue.remove();
System.out.println(node.value);
if(node.right!=null){
queue.push(node.right);
}
if(node.left!=null){
queue.push(node.left);
}
}
}
4.最值:最小值一直左孩子到底,最大值一直右孩子到底
public Object min(Node root){
if(root==null) return null;
Node node = root;
while(node.left!=null){
node = node.left;
}
return node.value;
}
5.查找,非递归,只是循环中比较大小确定左或者右子树,直到节点值相等
public Object searchNode(Object key){
if(root==null) return null;
Node node = root;
while(!node.value.equals(key)){
if(node==null){
return null;
}
if(key<node.value){
node = node.left;
} else{
node = node.right;
}
}
return node.value;
}