在学习数据结构中最常见的,最多考到的就是树,而树中最多使用到的就是二叉树,我们将学习如何对一棵二叉树进行增删改查,其中二叉树用二叉搜索树举例
首先,我们应该定义一个二叉树的节点信息
public class TreeNode {
int val;
TreeNode left;
TreeNode rigth;
TreeNode(int x){
val = x;
}
@Override
public String toString() {
return String.valueOf(val);
}
}
对于树节点node的所有子节点进行遍历,查找x值是否存在,如果大于当前值则寻找node的右节点,如果小于则查找左节点,否则意味着node.val==x
则返回node节点
public TreeNode Find(int x, TreeNode node) {
if (node == null) {
return null;
} else if (x > node.val) {
return Find(x, node.rigth);
} else if (x < node.val) {
return Find(x, node.left);
} else {
return node;
}
}
寻找最小值就是不断地寻找最左子节点
public TreeNode FindMin(TreeNode node) {
if (node == null) {
return null;
} else if (node.left == null) {
return node;
} else {
return FindMin(node.left);
}
}
与寻找最小值相似,寻找最大值的过程就是不断寻找最右子节点
public TreeNode FindMax(TreeNode node) {
if (node == null) {
return null;
} else if (node.rigth == null) {
return node;
} else {
return FindMax(node.rigth);
}
}
插入节点就是判断val
值对于当前node.val
是应该在左边还是在右边,如果当前节点为空,则新建一个值为val
的新节点
public TreeNode Insert(int val, TreeNode node) {
if (node == null) {
node = new TreeNode(val);
} else if (val < node.val) {
node.left = Insert(val, node.left);
} else if (val > node.val) {
node.rigth = Insert(val, node.rigth);
}
return node;
}
删除节点就是判断val
值对于当前node.val
是应该在左边还是在右边,如果等于当前节点,则判断是否只有一个节点,如果是则将它的下一个节点指向下一个节点的下一个节点,如果有两个节点,则将该值变为右子树中的最小值,并删除右子树的最小值
public TreeNode Delete(int val, TreeNode node) {
if (node == null) {
return null;
} else if (val < node.val) {
node.left = Delete(val, node.left);
} else if (val > node.val) {
node.rigth = Delete(val, node.rigth);
} else if (node.left != null && node.rigth != null) {
TreeNode tmp = FindMin(node.rigth);
node.val = tmp.val;
node.rigth = Delete(tmp.val, node.rigth);
} else {
if (node.left == null) {
node = node.rigth;
} else if (node.rigth == null) {
node = node.left;
}
}
return node;
}
这样我们就完成了二叉搜索树的增加删除查询,修改就是在查询到结果之后进行对node.val
值的修改操作,在这里就不再赘述