专业移动微网站建设,资阳全搜索app,搜狗推广后台登录,公司网站模板 html恢复二叉搜索树
难度#xff1a;中等
题目描述
给你二叉搜索树的根节点 root #xff0c;该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下#xff0c;恢复这棵树 。
示例1
输入#xff1a; root [1,3,null,null,2] 输出#xff1a;[3,1,null,nul…恢复二叉搜索树
难度中等
题目描述
给你二叉搜索树的根节点 root 该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下恢复这棵树 。
示例1
输入 root [1,3,null,null,2] 输出[3,1,null,null,2]
示例2
输入 root [3,1,4,null,null,2] 输出[2,1,4,null,null,3]
题解
因为二叉搜索树的性质可得将其中序遍历存储到列表中数值为单调递增由此可以得到以下步骤
遍历列表找到递增中断点再次遍历列表找到中断点应该在的位置将两个数值进行交换
完成之后即为所求
想法代码
public class TreeNode
{public int val;public TreeNode left;public TreeNode right;public TreeNode(int val 0, TreeNode left null, TreeNode right null){this.val val;this.left left;this.right right;}
}
class Solution
{IListTreeNode travelList new ListTreeNode();public static void Main(String[] args){TreeNode root new TreeNode(3){left new TreeNode(1),right new TreeNode(4){left new TreeNode(2)}};Solution solution new Solution();solution.RecoverTree(root);foreach (var a in solution.travelList){Console.Write(a.val );}}public void RecoverTree(TreeNode root){Travel(root);int index1 1;int index2 0;while (index1 travelList.Count){if (travelList[index1].val travelList[index1 - 1].val){index1;}else{break;}}while (index2 travelList.Count){if (travelList[index2].val travelList[index1 - 1].val){break;}index2;}TreeNode treeNode1 travelList[index1 - 1];TreeNode treeNode2 travelList[index2 - 1];int val1 treeNode1.val;int val2 treeNode2.val;treeNode1.val val2;treeNode2.val val1;}public void Travel(TreeNode root){if (root null){return;}Travel(root.left);travelList.Add(root);Travel(root.right);}
}
avel(root.left);travelList.Add(root);Travel(root.right);}
}