侧边栏壁纸
博主头像
996worker

祇園精舎の鐘の聲, 諸行無常の響き有り。

  • 累计撰写 186 篇文章
  • 累计创建 46 个标签
  • 累计收到 8 条评论

目 录CONTENT

文章目录

ACM模式Java构造数据结构

996worker
2022-07-20 / 0 评论 / 0 点赞 / 22 阅读 / 3,459 字
温馨提示:
本文最后更新于 2022-08-05,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

链表

import java.util.*;

public class Main {
    static class Node {
        int val;
        Node next;

        Node(int val) {
            this.val = val;
        }
    }


    private static Node buildList(String[] strs) {
        if (strs == null || strs.length == 0) return null;

        Node dummy = new Node(0);

        Node ptr = dummy;

        for (String str : strs) {
            int num = Integer.parseInt(str);
            ptr.next = new Node(num);

            ptr = ptr.next;
        }

        return dummy.next;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String[] listStr1 = sc.nextLine().split(" ");
        String[] listStr2 = sc.nextLine().split(" ");

        Node list1 = buildList(listStr1);
        Node list2 = buildList(listStr2);

        Node resPtr = combine(list1, list2);

        while (resPtr != null) {
            System.out.println(resPtr.val + " ");
            resPtr = resPtr.next;
        }
    }

    private static Node combine(Node head1, Node head2) {
        Node dummy = new Node(0);
        Node ptr1 = head1;
        Node ptr2 = head2;
        Node ptr = dummy;

        while (ptr1 != null && ptr2 != null) {
            if (ptr1.val <= ptr2.val) {
                ptr.next = ptr1;
                ptr1 = ptr1.next;
            } else {
                ptr.next = ptr2;
                ptr2 = ptr2.next;
            }

            ptr = ptr.next;
        }

        if (ptr1 == null) {
            ptr.next = ptr2;
        } else {
            ptr.next = ptr1;
        }

        return dummy.next;
    }


}

二叉树(二叉堆数组)

import java.util.*;

public class Tree {
   static class TreeNode{
      int val;
      TreeNode left;
      TreeNode right;
      public TreeNode(){}
      public TreeNode(int val){
         this.val = val;
      }
   }
	//方法入口
   public static void main(String[] args) {
      Scanner scanner = new Scanner(System.in);
      String s = scanner.nextLine();
      String[] split = s.split(" ");
      int[] arr = new int[split.length];
      for(int i = 0; i < arr.length; i++){
         arr[i] = Integer.parseInt(split[i]);
      }
      //构建二叉树
      TreeNode root = build(arr);
      //层序遍历二叉树
      List<List<Integer>> res = help(root);
      //打印结果
      for (List<Integer> ans : res){
         System.out.print(ans);
      }
   }
   //层序遍历二叉树
   private static List<List<Integer>> help(TreeNode root) {
      List<List<Integer>> res = new ArrayList<>();
      LinkedList<TreeNode> queue = new LinkedList<>();
      queue.add(root);
      while(queue.size() > 0){
         List<Integer> tmp = new ArrayList<>();
         int size = queue.size();
         for (int i = 0; i < size; i++) {
            TreeNode node = queue.poll();
            tmp.add(node.val);
            if(node.left != null){
               queue.add(node.left);
            }
            if(node.right != null){
                  queue.add(node.right);
            }
         }
         res.add(tmp);
      }
      return res;
   }
   //构建二叉树
   private static TreeNode build(int[] arr) {
      List<TreeNode> list = new ArrayList<>();
      Collections.fill(list, null);
      TreeNode root = null;
      for(int i = 0; i < arr.length; i++){
         TreeNode node = null;
         if(arr[i] != -1){
            node = new TreeNode(arr[i]);
         }
         list.add(i,node);
         if(i == 0){
            root = node;
         }
      }
      for (int i = 0;  2 * i + 2 < arr.length ; i++) {
         if(list.get(i) != null){
            list.get(i).left = list.get(2 * i + 1);
            list.get(i).right = list.get(2 * i + 2);
         }
      }
      return root;
   }

}

二叉树(牛客)

输入要求:

输入描述:第一行两个数n,root,分别表示二叉树有n个节点,第root个节点时二叉树的根。接下来共n行,第i行三个数val_i,left_i,right_i,分别表示第i个节点的值val是val_i,左儿子left是第left_i个节点,右儿子right是第right_i个节点。
节点0表示空。
1<=n<=100000,保证是合法的二叉树
例如
5 1
5 2 3
1 0 0
3 4 5
4 0 0
6 0 0

代码

import java.util.*;

public class Tree {

    static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode () {

        }
        TreeNode (int val) {
            this.val = val;
        }
    }

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int len = sc.nextInt();
        int rootNo = sc.nextInt();

        TreeNode[] tree = new TreeNode[len];

        for (int i = 0; i < len; i++) {
            tree[i] = new TreeNode();
        }

        for (int i = 0; i < len; i++) {
            int val = sc.nextInt();
            int left = sc.nextInt();
            int right = sc.nextInt();

            tree[i].val = val;
            if (left != 0) {
                tree[i].left = tree[left - 1];
            }
            if(right != 0) {
                tree[i].right = tree[right - 1];
            }
        }

        long minValue = Long.MIN_VALUE;
        System.out.println(ifBst(tree[rootNo - 1], minValue));
    }

    private static boolean ifBst(TreeNode root, long minValue) {
        if (root == null) return true;
        boolean leftRes = ifBst((root.left), minValue);
        if (!leftRes) return false;

        if(root.val <= minValue) return false;
        minValue = root.val;

        boolean right = ifBst(root.right, minValue);
        return right;
    }
}
0

评论区