- A是根节点,Leaf是尾结点(比如H、I、J、F、G)
- Parent Node;Child Node; Left/Right Node;
- subtree是子树
- Height是指一个结点到尾结点的路径;Depth是指一个结点到根结点的路径
排序二叉树(BST)查找结点
public TreeNode get(int key){
TreeNode current=root;
while(current!=null &¤t.value!=key){
if(key<current.value){
current=current.left;
}else if(key>current.value){
current=current.right;
}
}
return current==null?null:current;
}
排序二叉树(BST)插入结点
public void insert(int key){
if(root===null){
root=new TreeNode(key);
return;
}
TreeNode current=root;
TreeNode parent=null;
while(true){
parent=current;
if(key>parent.value){
current=parent.right;
if(current==null){
parent.right=new TreeNode(key);
return;
}
}
else if(key<parent.value){
current=parent.left;
if(current==null){
parent.left=new TreeNode(key);
return;
}
}
else return; //BST 不允许有两个相同的结点存在
}
}
排序二叉树(BST)删除结点
分为三种情况:
- 删除的是尾结点----直接删除就可
- 删除的结点有且只有一个小孩—把它的小孩替代他
- 删除的结点有子树----左节点最大的或者右子树最小的
public boolean delete(int key) {
TreeNode parent = root;
TreeNode current = root;
boolean isLeftChild = false;
while(current != null && current.value != key) {
parent = current;
if(current.value > key) {
isLeftChild = true;
current = current.left;
} else {
isLeftChild = false;
current = current.right;
}
}
if(current == null) {
return false;
}
// Case 1: if node to be deleted has no children
if(current.left == null && current.right == null) {
if(current == root) {
root = null;
} else if(isLeftChild) {
parent.left = null;
} else {
parent.right = null;
}
// Case 2: if node to be deleted has only one child
} else if (current.right == null) {
if(current == root) {
root = current.left;
} else if (isLeftChild) {
parent.left = current.left;
} else {
parent.right = current.left;
}
} else if (current.left == null) {
if(current == root) {
root = current.right;
} else if (isLeftChild) {
parent.left = current.right;
} else {
parent.right = current.right;
}
// Case 3: current.left != null && current.right != null
} else {
TreeNode successor = getSuccessor(current);
if (current == root) {
root = successor;
} else if (isLeftChild) {
parent.left = successor;
} else {
parent.right = successor;
}
successor.left = current.left;
}
return true;
}
private TreeNode getSuccessor(TreeNode node) {
TreeNode successor = null;
TreeNode successorParent = null;
TreeNode current = node.right;
while (current != null) {
successorParent = successor;
successor = current;
current = current.left;
}
if (successor != node.right) {
successorParent.left= successor.right;
successor.right = node.right;
}
return successor;
}
前序、中序、后序遍历树
public static void preOrderTraversal(TreeNode root) {
if(root == null) {
return;
}
System.out.println(root.value);
preOrderTraversal(root.left);
preOrderTraversal(root.right);
}
public static void inOrderTraversal(TreeNode root) {
if(root == null) {
return;
}
inOrderTraversal(root.left);
System.out.println(root.value);
inOrderTraversal(root.right);
}
public static void postOrderTraversal(TreeNode root) {
if(root == null) {
return;
}
postOrderTraversal(root.left);
postOrderTraversal(root.right);
System.out.println(root.value);
}