ZBLOG

import java.util.List; 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; ...

以下是修改后的代码,使用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));
    }
}

以上代码进行了如下修改:

  1. 在构建二叉树时,使用HashSet来降低查重。如果已经存在相同节点数据,则不再添加到二叉树中。
  2. 对于寻找双亲节点和当前节点的操作,使用了更简洁的递归实现。
  3. 修改了判断兄弟节点的逻辑,根据父节点的左右子节点是否等于当前节点来确定兄弟节点。
  4. 修正了输出结果中多余的逗号。
  5. 进行代码格式调整,使其更易读。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=15240

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?