前言
上次学习了基本的输入输出,现在记录下常用的数据机构。
需要建立二叉树
题目来源
只有学会了建树,才能完成后续的解题方法的研究。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < arr.length; i ++) {
arr[i] = sc.nextInt();
}
TreeNode root = new TreeNode(arr[0]);
for (int i = 1; i < arr.length; i ++) {
createBST(root, arr[i]);
}
DLR(root);
System.out.println();
LDR(root);
System.out.println();
LRD(root);
System.out.println();
}
}
public static void createBST(TreeNode root, int value) {
if(root.value == value) return;
if(value < root.value) {
if(root.left == null) root.left = new TreeNode(value);
else createBST(root.left, value);
} else {
if(root.right == null) root.right = new TreeNode(value);
else createBST(root.right, value);
}
}
public static void DLR(TreeNode root) {
if(root != null) {
System.out.print(root.value + " ");
DLR(root.left);
DLR(root.right);
}
}
public static void LDR(TreeNode root) {
if(root != null) {
LDR(root.left);
System.out.print(root.value + " ");
LDR(root.right);
}
}
public static void LRD(TreeNode root) {
if(root != null) {
LRD(root.left);
LRD(root.right);
System.out.print(root.value + " ");
}
}
static class TreeNode {
private int value;
private TreeNode left;
private TreeNode right;
public TreeNode(int value) {
this.value = value;
}
}
}需要建立链表的时候
import java.util.Scanner;
public class Main {
//定义Node节点
static class ListNode {
public int val;
public ListNode next = null;
public ListNode(int val) {
this.val = val;
}
}
public static void main(String[] args) {
//1.获取输入信息
Scanner scanner = new Scanner(System.in);
String string = scanner.nextLine();
int k = scanner.nextInt();
String[] strings = string.split(" ");
//2.创建头结点
ListNode head = new ListNode(0);
ListNode tail = head;
//3.将输入的字符串变为链表节点
for (String str : strings) {
ListNode newNode = new ListNode(Integer.valueOf(str));
tail.next = newNode;
tail = tail.next;
}
head = head.next;
//每k个反转链表
ListNode node = reverseGroup(head, k);
while(node!=null){
System.out.print(node.val+" ");
node = node.next;
}
}
//不停地取k个进行翻转,如果不够k个,就直接返回,结束
public static ListNode reverseGroup(ListNode head, int k) {
if (head == null || head.next == null || k <= 1)
return head;
ListNode currentNode = head;
//获取k个元素的首尾节点
for (int count = 1; count < k; count++) {
currentNode = currentNode.next;
//不够K个则返回
if(currentNode==null)
return head;
}
ListNode next = currentNode.next;
//对局部链表进行反转
reverse(head,currentNode);
head.next=reverseGroup(next,k);
return currentNode;
}
//写一个头尾节点反转的局部函数
public static ListNode reverse(ListNode head, ListNode tail) {
if (head == null || head.next == null)
return head;
ListNode pre = null;
ListNode next = null;
while (pre != tail) {
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
}


京公网安备 11010502036488号