一、题目
1、审题
2、分析
给出一个二叉查找树,其中有两个元素的位置弄错了,写算法将其恢复。
二、解答
1、思路:
方法一、
通过中序遍历可以确定一棵二叉查找树由小到大的顺序。
所以在此错位的查找树中查找到的节点中有 1 个比后续节点值大,最后 1 个比前面相邻节点值小。交换这两个结点值即可。
TreeNode firstElement = null; TreeNode secondElement = null; TreeNode prevElement = new TreeNode(Integer.MIN_VALUE); public void recoverTree(TreeNode root) { traverse(root); int tmp = firstElement.val; firstElement.val = secondElement.val; secondElement.val = tmp; } private void traverse(TreeNode root) { if(root == null) return; traverse(root.left); /// if(firstElement == null && prevElement.val >= root.val) firstElement = prevElement; // 记录第一个比后续元素大的那个结点 if(firstElement != null && prevElement.val >= root.val) secondElement = root; // 记录最后一个比前一个结点小的节点。 prevElement = root; // 要查找的节点指针往后移动 /// traverse(root.right); }