以下是修改后的代码,使用HashSet来降低查重:
import java.util.HashSet;
import java.util.Scanner;
class Node {
Node left;
Node right;
int data;
public Node(int data) {
this.left = null;
this.right = null;
this.data = data;
}
}
class BinaryTree {
Node root;
public BinaryTree() {
root = null;
}
public void buildTree(Node node, int data) {
if (root == null) {
root = new Node(data);
} else {
if (data < node.data) {
if (node.left == null) {
node.left = new Node(data);
} else {
buildTree(node.left, data);
}
} else if (data > node.data) {
if (node.right == null) {
node.right = new Node(data);
} else {
buildTree(node.right, data);
}
}
}
}
public Node parent(int key) {
return parent(root, key);
}
public Node parent(Node node, int key) {
if (node == null) return null;
if ((node.left != null && node.left.data == key) || (node.right != null && node.right.data == key)) {
return node;
}
Node parentNode = parent(node.left, key);
if (parentNode != null) return parentNode;
return parent(node.right, key);
}
public Node findNode(int key) {
return findNode(root, key);
}
public Node findNode(Node rootNode, int key) {
if (rootNode == null || rootNode.data == key)
return rootNode;
Node leftResult = findNode(rootNode.left, key);
if(leftResult != null)
return leftResult;
return findNode(rootNode.right, key);
}
public void preOrder(Node node, StringBuilder str) {
if (node != null) {
str.append(node.data).append(",");
preOrder(node.left, str);
preOrder(node.right, str);
}
}
public void inOrder(Node node, StringBuilder str) {
if (node != null) {
inOrder(node.left, str);
str.append(node.data).append(",");
inOrder(node.right, str);
}
}
public void postOrder(Node node, StringBuilder str) {
if (node != null) {
postOrder(node.left, str);
postOrder(node.right, str);
str.append(node.data).append(",");
}
}
}
public class Main {
public static void main(String[] args) {
StringBuilder str = new StringBuilder();
Scanner scanner = new Scanner(System.in);
int count = scanner.nextInt();
String[] a = scanner.next().split(",");
int key = scanner.nextInt();
BinaryTree bTree = new BinaryTree();
HashSet<Integer> set = new HashSet<>();
for (int i = 0; i < a.length; i++) {
int num = Integer.parseInt(a[i]);
if (!set.contains(num)) { // 查重
bTree.buildTree(bTree.root, num);
set.add(num); // 加入HashSet中,防止重复添加节点
}
}
Node parent = bTree.parent(key);
if (parent == null) {
System.out.println(key + "无双亲");
} else {
System.out.println(key + "的双亲是" + parent.data);
}
Node currNode = bTree.findNode(key);
if (currNode == null) {
System.out.println("不存在当前节点");
} else {
if (currNode.left == null && currNode.right == null) {
System.out.println(key + "无孩子");
} else {
System.out.print(key + (currNode.left == null ? "无左孩子" : "的左孩子是" + currNode.left.data));
System.out.println(currNode.right == null ? "无右孩子" : "右孩子是" + currNode.right.data);
}
}
if (parent == null) {
System.out.println(key + "无兄弟");
} else {
Node sibling = parent.left != null && parent.left.data == key ? parent.right : parent.left;
if (sibling == null) {
System.out.println(key + "无兄弟");
} else {
System.out.println(key + "的兄弟是" + sibling.data);
}
}
bTree.preOrder(bTree.root, str);
System.out.println("前序结果:" + str.substring(0, str.length() - 1));
str.setLength(0);
bTree.inOrder(bTree.root, str);
System.out.println("中序结果:" + str.substring(0, str.length() - 1));
str.setLength(0);
bTree.postOrder(bTree.root, str);
System.out.println("后序结果:" + str.substring(0, str.length() - 1));
}
}
以上代码进行了如下修改:
- 在构建二叉树时,使用HashSet来降低查重。如果已经存在相同节点数据,则不再添加到二叉树中。
- 对于寻找双亲节点和当前节点的操作,使用了更简洁的递归实现。
- 修改了判断兄弟节点的逻辑,根据父节点的左右子节点是否等于当前节点来确定兄弟节点。
- 修正了输出结果中多余的逗号。
- 进行代码格式调整,使其更易读。
内容由零声教学AI助手提供,问题来源于学员提问




