package class14;
import java.util.Stack;
// 本题测试链接 : https://leetcode.com/problems/recover-binary-search-tree/
public class Code05_RecoverBinarySearchTree {
// 不要提交这个类
public static class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int v) {
val = v;
}
}
// 如果能过leetcode,只需要提交这个方法即可
// 但其实recoverTree2才是正路,只不过leetcode没有那么考
public static void recoverTree(TreeNode root) {
TreeNode[] errors = twoErrors(root);
if (errors[0] != null && errors[1] != null) {
int tmp = errors[0].val;
errors[0].val = errors[1].val;
errors[1].val = tmp;
}
}
public static TreeNode[] twoErrors(TreeNode head) {
TreeNode[] ans = new TreeNode[2];
if (head == null) {
return ans;
}
TreeNode cur = head;
TreeNode mostRight = null;
TreeNode pre = null;
TreeNode e1 = null;
TreeNode e2 = null;
while (cur != null) {
mostRight = cur.left;
if (mostRight != null) {
while (mostRight.right != null && mostRight.right != cur) {
mostRight = mostRight.right;
}
if (mostRight.right == null) {
mostRight.right = cur;
cur = cur.left;
continue;
} else {
mostRight.right = null;
}
}
if (pre != null && pre.val >= cur.val) {
e1 = e1 == null ? pre : e1;
e2 = cur;
}
pre = cur;
cur = cur.right;
}
ans[0] = e1;
ans[1] = e2;
return ans;
}
// 以下的方法,提交leetcode是通过不了的,但那是因为leetcode的验证方式有问题
// 但其实!以下的方法,才是正路!在结构上彻底交换两个节点,而不是值交换
public static TreeNode recoverTree2(TreeNode head) {
TreeNode[] errs = getTwoErrNodes(head);
TreeNode[] parents = getTwoErrParents(head, errs[0], errs[1]);
TreeNode e1 = errs[0];
TreeNode e1P = parents[0];
TreeNode e1L = e1.left;
TreeNode e1R = e1.right;
TreeNode e2 = errs[1];
TreeNode e2P = parents[1];
TreeNode e2L = e2.left;
TreeNode e2R = e2.right;
if (e1 == head) {
if (e1 == e2P) {
e1.left = e2L;
e1.right = e2R;
e2.right = e1;
e2.left = e1L;
} else if (e2P.left == e2) {
e2P.left = e1;
e2.left = e1L;
e2.right = e1R;
e1.left = e2L;
e1.right = e2R;
} else {
e2P.right = e1;
e2.left = e1L;
e2.right = e1R;
e1.left = e2L;
e1.right = e2R;
}
head = e2;
} else if (e2 == head) {
if (e2 == e1P) {
e2.left = e1L;
e2.right = e1R;
e1.left = e2;
e1.right = e2R;
} else if (e1P.left == e1) {
e1P.left = e2;
e1.left = e2L;
e1.right = e2R;
e2.left = e1L;
e2.right = e1R;
} else {
e1P.right = e2;
e1.left = e2L;
e1.right = e2R;
e2.left = e1L;
e2.right = e1R;
}
head = e1;
} else {
if (e1 == e2P) {
if (e1P.left == e1) {
e1P.left = e2;
e1.left = e2L;
e1.right = e2R;
e2.left = e1L;
e2.right = e1;
} else {
e1P.right = e2;
e1.left = e2L;
e1.right = e2R;
e2.left = e1L;
e2.right = e1;
}
} else if (e2 == e1P) {
if (e2P.left == e2) {
e2P.left = e1;
e2.left = e1L;
e2.right = e1R;
e1.left = e2;
e1.right = e2R;
} else {
e2P.right = e1;
e2.left = e1L;
e2.right = e1R;
e1.left = e2;
e1.right = e2R;
}
} else {
if (e1P.left == e1) {
if (e2P.left == e2) {
e1.left = e2L;
e1.right = e2R;
e2.left = e1L;
e2.right = e1R;
e1P.left = e2;
e2P.left = e1;
} else {
e1.left = e2L;
e1.right = e2R;
e2.left = e1L;
e2.right = e1R;
e1P.left = e2;
e2P.right = e1;
}
} else {
if (e2P.left == e2) {
e1.left = e2L;
e1.right = e2R;
e2.left = e1L;
e2.right = e1R;
e1P.right = e2;
e2P.left = e1;
} else {
e1.left = e2L;
e1.right = e2R;
e2.left = e1L;
e2.right = e1R;
e1P.right = e2;
e2P.right = e1;
}
}
}
}
return head;
}
public static TreeNode[] getTwoErrNodes(TreeNode head) {
TreeNode[] errs = new TreeNode[2];
if (head == null) {
return errs;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode pre = null;
while (!stack.isEmpty() || head != null) {
if (head != null) {
stack.push(head);
head = head.left;
} else {
head = stack.pop();
if (pre != null && pre.val > head.val) {
errs[0] = errs[0] == null ? pre : errs[0];
errs[1] = head;
}
pre = head;
head = head.right;
}
}
return errs;
}
public static TreeNode[] getTwoErrParents(TreeNode head, TreeNode e1, TreeNode e2) {
TreeNode[] parents = new TreeNode[2];
if (head == null) {
return parents;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
while (!stack.isEmpty() || head != null) {
if (head != null) {
stack.push(head);
head = head.left;
} else {
head = stack.pop();
if (head.left == e1 || head.right == e1) {
parents[0] = head;
}
if (head.left == e2 || head.right == e2) {
parents[1] = head;
}
head = head.right;
}
}
return parents;
}
// for test -- print tree
public static void printTree(TreeNode head) {
System.out.println("Binary Tree:");
printInOrder(head, 0, "H", 17);
System.out.println();
}
public static void printInOrder(TreeNode head, int height, String to, int len) {
if (head == null) {
return;
}
printInOrder(head.right, height + 1, "v", len);
String val = to + head.val + to;
int lenM = val.length();
int lenL = (len - lenM) / 2;
int lenR = len - lenM - lenL;
val = getSpace(lenL) + val + getSpace(lenR);
System.out.println(getSpace(height * len) + val);
printInOrder(head.left, height + 1, "^", len);
}
public static String getSpace(int num) {
String space = " ";
StringBuffer buf = new StringBuffer("");
for (int i = 0; i < num; i++) {
buf.append(space);
}
return buf.toString();
}
// 为了测试
public static boolean isBST(TreeNode head) {
if (head == null) {
return false;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode pre = null;
while (!stack.isEmpty() || head != null) {
if (head != null) {
stack.push(head);
head = head.left;
} else {
head = stack.pop();
if (pre != null && pre.val > head.val) {
return false;
}
pre = head;
head = head.right;
}
}
return true;
}
public static void main(String[] args) {
TreeNode head = new TreeNode(5);
head.left = new TreeNode(3);
head.right = new TreeNode(7);
head.left.left = new TreeNode(2);
head.left.right = new TreeNode(4);
head.right.left = new TreeNode(6);
head.right.right = new TreeNode(8);
head.left.left.left = new TreeNode(1);
printTree(head);
System.out.println(isBST(head));
System.out.println("situation 1");
TreeNode head1 = new TreeNode(7);
head1.left = new TreeNode(3);
head1.right = new TreeNode(5);
head1.left.left = new TreeNode(2);
head1.left.right = new TreeNode(4);
head1.right.left = new TreeNode(6);
head1.right.right = new TreeNode(8);
head1.left.left.left = new TreeNode(1);
printTree(head1);
System.out.println(isBST(head1));
TreeNode res1 = recoverTree2(head1);
printTree(res1);
System.out.println(isBST(res1));
System.out.println("situation 2");
TreeNode head2 = new TreeNode(6);
head2.left = new TreeNode(3);
head2.right = new TreeNode(7);
head2.left.left = new TreeNode(2);
head2.left.right = new TreeNode(4);
head2.right.left = new TreeNode(5);
head2.right.right = new TreeNode(8);
head2.left.left.left = new TreeNode(1);
printTree(head2);
System.out.println(isBST(head2));
TreeNode res2 = recoverTree2(head2);
printTree(res2);
System.out.println(isBST(res2));
System.out.println("situation 3");
TreeNode head3 = new TreeNode(8);
head3.left = new TreeNode(3);
head3.right = new TreeNode(7);
head3.left.left = new TreeNode(2);
head3.left
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
数据结构和算法是计算机科学的核心基础,对于编程开发人员来说,掌握它们至关重要。以下是关于Java数据结构和算法的一些介绍: Java作为一种流行的编程语言,在数据结构和算法的实现方面有着广泛的应用。数据结构指的是在计算机中组织和存储数据的方式,算法则是明确定义的解决特定问题的规则和步骤。数据结构和算法彼此密切相关,良好的数据结构设计可以更高效地实现算法,而算法的设计也需要考虑数据的组织方式。 Java提供了丰富的数据结构,包括数组、链表、栈、队列、树、图等。掌握这些数据结构的特点、优缺点以及适用场景,对于编写高质量的代码至关重要。例如,当需要快速插入和删除操作时,链表比数组更加高效;当需要快速随机访问时,数组比链表更加高效。树和图这样的数据结构在处理层次数据和网络数据时非常有用。 算法则是解决特定问题的步骤和方法。常见的算法包括排序算法(如冒泡排序、快速排序)、搜索算法(如二分查找)、图算法(如最短路径算法)等。掌握这些算法的思想和实现方式,可以提高代码的效率和性能。此外,算法设计中的一些基本思想,如递归、动态规划、贪心算法等,也是值得深入学习的。
资源推荐
资源详情
资源评论
收起资源包目录
java数据结构和算法实践 (348个子文件)
config 344B
description 73B
exclude 240B
HEAD 195B
HEAD 195B
HEAD 30B
HEAD 21B
pack-176a21f8bec588a6d3a5004bdd83370d842a6ce9.idx 77KB
index 36KB
Code05_RecoverBinarySearchTree.java 13KB
Code02_PoemProblem.java 12KB
Code01_LightProblem.java 12KB
TreeChainPartition.java 9KB
Code04_DeleteMinCost.java 9KB
Code01_PickBands.java 9KB
Code02_MinCostToYeahArray.java 9KB
Code06_AOE.java 8KB
Code01_LCATarjanAndTreeChainPartition.java 8KB
Code04_JumpGameOnMatrix.java 7KB
Problem_0317_ShortestDistanceFromAllBuildings.java 7KB
Problem_0406_QueueReconstructionByHeight.java 7KB
Code02_Mod3Max.java 7KB
Code04_MergeRecord.java 6KB
Code04_VisibleMountains.java 6KB
Code02_Cola.java 6KB
Problem_0248_StrobogrammaticNumberIII.java 6KB
Code04_SnakeGame.java 6KB
Code01_IsSum.java 6KB
Code05_WorldBreak.java 6KB
Code02_LFUCache.java 6KB
Code03_ScrambleString.java 6KB
Code01_PreAndInArrayToPosArray.java 6KB
Code01_SplitTo01.java 6KB
Code01_SumNoPositiveMinCost.java 5KB
Code02_PalindromePartitioningII.java 5KB
Code07_FreedomTrail.java 5KB
Problem_0124_BinaryTreeMaximumPathSum.java 5KB
Code05_CardsProblem.java 5KB
Code05_BestTimeToBuyAndSellStockWithCooldown.java 5KB
Code03_FindWordInMatrix.java 5KB
Code05_AllSame.java 5KB
Code02_KthMinPair.java 5KB
Code07_TargetSum.java 4KB
Code01_MinimumInsertionStepsToMakeAStringPalindrome.java 4KB
Problem_0148_SortList.java 4KB
Problem_0324_WiggleSortII.java 4KB
Code02_DynamicSegmentTree.java 4KB
Code02_GreatWall.java 4KB
Problem_0465_OptimalAccountBalancing.java 4KB
Code01_NCardsABWin.java 4KB
Code05_MinimumCostToMergeStones.java 4KB
Code03_ShuffleProblem.java 4KB
Code05_BooleanEvaluation.java 4KB
Code03_NotContains4.java 4KB
LCP_0003_Robot.java 4KB
Code04_Drive.java 4KB
Code03_PalindromePairs2.java 4KB
Code03_WatchMovieMaxTime.java 4KB
Problem_0411_MinimumUniqueWordAbbreviation.java 4KB
Code02_GameForEveryStepWin.java 4KB
Code02_TopK.java 4KB
Code04_BricksFallingWhenHit.java 4KB
Code06_ClosestSubsequenceSum.java 4KB
ExaminationPaperWays.java 4KB
Code06_SplitStringMaxValue.java 4KB
Code02_MinCameraCover.java 4KB
Problem_0639_DecodeWaysII.java 3KB
Problem_0127_WordLadder.java 3KB
Code04_RegularExpressionMatch.java 3KB
Code01_MaxXOR.java 3KB
Code04_WordLadderII.java 3KB
Code02_WordSearchII.java 3KB
Code01_MaxAndValue.java 3KB
Code05_CandyProblem.java 3KB
Code05_Query3Problems.java 3KB
Problem_0475_Heaters.java 3KB
Problem_0642_DesignSearchAutocompleteSystem.java 3KB
Code01_ContainAllCharExactly.java 3KB
Code01_MinKthPairMinusABS.java 3KB
Code01_DynamicSegmentTree.java 3KB
Code04_GasStation.java 3KB
Code02_ShortestBridge.java 3KB
Problem_0272_ClosestBinarySearchTreeValueII.java 3KB
Problem_0425_WordSquares.java 3KB
Code03_MaxMeetingScore.java 3KB
Code01_LRUCache.java 3KB
Code02_SmallestUnFormedSum.java 3KB
Code04_TopKSumCrossTwoArrays.java 3KB
Code01_StringKth.java 3KB
Code01_MinRange.java 3KB
Code04_FindKMajority.java 3KB
Code03_BiggestBSTTopologyInTree.java 3KB
Problem_0472_ConcatenatedWords.java 3KB
Code04_MostXorZero.java 3KB
Code01_ConstructBinarySearchTreeFromPreorderTraversal.java 3KB
Code04_MaxPairNumber.java 3KB
Code01_SplitBuildingBlock.java 3KB
Code01_ReverseInvertString.java 3KB
Code05_0123Disappear.java 3KB
Code05_JosephusProblem.java 3KB
共 348 条
- 1
- 2
- 3
- 4
资源评论
进击的代码家
- 粉丝: 2202
- 资源: 203
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功