2026/2/11 3:31:10
网站建设
项目流程
公司网站建设费用明细表,个人网站的前途,顺庆区城乡规划建设局门户网站,网级移动营销下载输入#xff1a; 二叉搜索树根节点 root#xff0c;其中恰好有两个节点的值被错误交换。
要求#xff1a; 在不改变树结构的情况下恢复 BST#xff08;只允许改节点值#xff09;。
输出#xff1a; 无#xff08;原地修改 root#xff09;。思路#xff1a;
BST 的中…输入二叉搜索树根节点root其中恰好有两个节点的值被错误交换。要求在不改变树结构的情况下恢复 BST只允许改节点值。输出无原地修改root。思路BST 的中序遍历应该是严格递增序列。一旦有两个节点值被交换中序序列里就会出现“乱序”表现为逆序对正常... a b c d ...交换后可能出现相邻交换只出现1 次逆序例如... a c b d ...在c b处逆序不相邻交换出现2 次逆序例如... a d c b ...会在d c、c b两处逆序所以我们中序遍历时维护prev上一个访问的节点若发现prev-val node-val说明出现逆序。第一次逆序first prev大的那个每次逆序都更新second node小的那个相邻交换只会更新一次second不相邻交换第二次逆序会把second更新成最终正确的小节点遍历结束后交换first和second的值即可恢复。复杂度时间复杂度O(N)空间复杂度O(H)递归栈H 为树高classSolution{public:voidrecoverTree(TreeNode*root){firstnullptr;secondnullptr;prevnullptr;inorder(root);if(first!nullptrsecond!nullptr){inttmpfirst-val;first-valsecond-val;second-valtmp;}}private:TreeNode*first;TreeNode*second;TreeNode*prev;voidinorder(TreeNode*node){if(nodenullptr)return;inorder(node-left);if(prev!nullptrprev-valnode-val){if(firstnullptr)firstprev;secondnode;}prevnode;inorder(node-right);}};