一、题目
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);}