二叉树
- 二叉树是一个连通的无环图,并且每一个顶点的度不大于3
- 在非空二叉树中,第i层的结点总数不超过 , i>=1;
- 深度为h的二叉树最多有 个结点(h>=1),最少有h个结点;
- 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;
二叉树基本操作
- 节点的定义
/**
* Created by ln on 2017/5/6.
*/
public class Node {
public Node left;
public Node right;
public int value;
public int color;
public void displayNode(){
}
}
- 属性:根节点
public Node root;
- 插入操作
public void insert(int v,int c){
Node newNode = new Node();
newNode.value = v;
newNode.color = c;
if(root == null){
root = newNode;
}else{
Node current = root;
Node parent;
while (true){
parent = current;
if(v<parent.value){
current = parent.left;
if(current==null){
parent.left = newNode;
return;
}
}else{
current = parent.right;
if(current==null){
parent.right=newNode;
return;
}
}
}
}
}
- 查找操作
public Node find(int key){
Node current = root;
while (current.value!=key){
if(key<current.value){
current = current.left;
}else{
current = current.right;
}
if(current==null){
return null;
}
}
return current;
}
- 查找最小
public Node findMin(){
Node current = root;
while (true){
if(current.left==null){
break;
}else {
current = current.left;
}
}
return current;
}
- 查找最大
public Node findMax(){
Node current = root;
while (true){
if(current.right==null){
break;
}else {
current = current.right;
}
}
return current;
}
- 删除操作
public boolean delete(int key){
boolean isLeft = true;
Node current = root;
Node parent = current;
while (current.value!=key){
parent = current;
if(key<current.value){
isLeft = true;
current = current.left;
}else{
isLeft = false;
current = current.right;
}
if(current==null){
return false;
}
}
if(current.left==null&¤t.right==null){
if(current==root){
current=null;
}else if(isLeft){
parent.left=null;
}else {
parent.right=null;
}
}else if(current.right==null){
if(current==root){
root = current.left;
}else if(isLeft){
parent.left=current.left;
}else {
parent.right=current.left;
}
}else if(current.left==null) {
if (current == root) {
root = current.right;
} else if (isLeft) {
parent.left = current.right;
} else {
parent.right = current.right;
}
}else {
Node node = getLast(current);
if(current==root){
root = node;
}else if(isLeft){
parent.left=node;
}else {
parent.right=node;
}
node.left = current.left;
}
return true;
}
public Node getLast(Node dNode){
Node rNode = dNode.right;
Node parent = dNode;
while (rNode.left!=null){
parent = rNode;
rNode = rNode.left;
}
if(rNode!=dNode.right){
parent.left=rNode.right;
rNode.right=dNode.right;
}
return rNode;
}
- 遍历操作
public void inOrder(Node node){
if(node!=null){
inOrder(node.left);
System.out.print(node.value+" ");
inOrder(node.right);
}
}