二叉树的遍历和删除
/**
* 二叉树
*/
public class BinaryTree {
public static void main(String[] args) {
// 这里先使用手动构建二叉树
Node node = new Node("德玛西亚之力");
Node node1 = new Node("诺克萨斯之手");
Node node2 = new Node("无情铁手");
Node node3 = new Node("致残打击");
Node node4 = new Node("大杀四方");
node.left = node1;
node.right = node2;
node1.left = node3;
node1.right = node4;
BinaryTree binaryTree = new BinaryTree();
System.out.println("前序遍历");
binaryTree.preOrder(node);
System.out.println("-----------------");
System.out.println("中序遍历");
binaryTree.midOrder(node);
System.out.println("-----------------");
binaryTree.postOrder(node);
System.out.println("后序遍历");
System.out.println("-----------------");
// 前中后续查找
System.out.println(binaryTree.preSearch(node, "残打击"));
System.out.println(binaryTree.midSearch(node, "大杀四方"));
System.out.println(binaryTree.postSearch(node, "无情铁手"));
// 删除节点
binaryTree.delNode(node, "大杀四方");
binaryTree.preOrder(node);
}
public static class Node {
public Node left;
public Node right;
public String value;
public Node(String value) {
this.value = value;
}
@Override
public String toString() {
return "Node{" +
"value='" + value + '\'' +
'}';
}
}
/**
* 前序遍历
* @param node:二叉树头节点
*/
public void preOrder(Node node) {
System.out.println(node.value);
if (node.left != null) {
preOrder(node.left);
}
if (node.right != null) {
preOrder(node.right);
}
}
/**
* 中序遍历
* @param node:二叉树头节点
*/
public void midOrder(Node node) {
if (node.left != null) {
preOrder(node.left);
}
System.out.println(node.value);
if (node.right != null) {
preOrder(node.right);
}
}
/**
* 后序遍历
* @param node:二叉树头节点
*/
public void postOrder(Node node) {
if (node.left != null) {
preOrder(node.left);
}
if (node.right != null) {
preOrder(node.right);
}
System.out.println(node.value);
}
/**
* 前序查找
* @param node:二叉树头节点
* @param target:目标节点
* @return
*/
public Node preSearch(Node node, String target) {
Node res = null;
if (Objects.equals(node.value, target)) {
return node;
}
if (node.left != null) {
res = preSearch(node.left, target);
}
// 这里找到了 return 的原因是因为如果不 return,会被后续的右子树查找覆盖 res,使 res 为 null
if (res != null) {
return res;
}
if (node.right != null) {
res = preSearch(node.right, target);
}
return res;
}
/**
* 中序查找
* @param node:二叉树头节点
* @param target:目标节点
* @return
*/
public Node midSearch(Node node, String target) {
Node res = null;
if (node.left != null) {
res = midSearch(node.left, target);
}
if (res != null) {
return res;
}
if (Objects.equals(node.value, target)) {
return node;
}
if (node.right != null) {
res = midSearch(node.right, target);
}
return res;
}
/**
* 后序查找
* @param node:二叉树头节点
* @param target:目标节点
* @return
*/
public Node postSearch(Node node, String target) {
Node res = null;
if (node.left != null) {
res = postSearch(node.left, target);
}
if (res != null) {
return res;
}
if (node.right != null) {
res = postSearch(node.right, target);
}
if (Objects.equals(node.value, target)) {
return node;
}
return res;
}
/**
* 删除节点:这里删除如果遇到是直接删除该节点和后面的子树,比较粗暴,后序继续学习再修改
* @param node:二叉树头节点
* @param target:目标节点
* @return
*/
public void delNode(Node node, String target) {
if (node.left != null && Objects.equals(node.left.value, target)) {
node.left = null;
return;
}
if (node.right != null && Objects.equals(node.right.value, target)) {
node.right = null;
return;
}
if (node.left != null) {
delNode(node.left, target);
}
if (node.right != null) {
delNode(node.right, target);
}
}
}