Day. 28 Recover Binary Search Tree

Leetcode #99. Recover Binary Search Tree

https://ithelp.ithome.com.tw/upload/images/20211005/20129767ooaIBrEzex.png

简单来说二元树里面,有两个node的值位置是错的,请把它纠正回来
像例子1,3在1的左边,不合二元树的特性,所以1跟3交换,这样就符合二元树的特性。


防雷
防雷
防雷


大家还记得InOrder的走访吗?
它会照着值的顺序,我们只要找到不照顺序的值,把它记下来,最後做交换就可以解决了

例1

     2
    / \
   3   1

firstNode, secondNode用来记需要交换的两个node
以InOrder的顺序output: [3,2,1]
正确的二元树每一个值都会比前面的小,当2发现前面的是3比自己大,我们把3记在firstNode,2记在secondNode,到1的位置发现2比较大,firstNode的位置已经有了,所以一样放在secondNode。
最後3跟1交换

例2

      3
    /   \
   1     4
        /
       2

以InOrder的顺序output: [1,3,2,4]
2比3小,firstNode=3,secondNode=2,最後交换。

程序

func recoverTree(root *TreeNode) {
	var firstNode, secondNode, preNode *TreeNode
	InOrderDFS(root, &preNode, &firstNode, &secondNode)

	firstNode.Val, secondNode.Val = secondNode.Val, firstNode.Val
}

func InOrderDFS(node *TreeNode, preNode, firstNode, secondNode **TreeNode) {
	if node == nil {
		return
	}

	InOrderDFS(node.Left, preNode, firstNode, secondNode)

	if *preNode != nil && node.Val < (*preNode).Val {
		if *firstNode == nil {
			*firstNode = *preNode
		}
		*secondNode = node
	}

    // 这一行很重要 前一个节点要用InOrder的顺序
	*preNode = node

	InOrderDFS(node.Right, preNode, firstNode, secondNode)
}

<<:  [Day21] 与问题成员对话-案例三:PIP

>>:  Day22-React Life Cycle 篇-上篇(介绍生命周期图 & Mounting)

JAVA - Windows 10 安装 Maven

JAVA - Windows 10 安装 Maven 参考资料 参考:(一)maven 新手教学: ...

【第二十二天 - XSS Lab】

Q1. XSS Lab 为了避免骇客透过 JS 进行攻击,工程师会进行过滤,以下就针对 prompt...

[Day01] 前言:常见的前端实战技能有哪些?

Credit: https://lilly021.com/angular-vs-react-vs-...

新新新手阅读 Angular 文件 - Component - Day24

本文内容 阅读有关元件的 lifecycle hook - ngDoCheck 的内容 ngDoCh...

[Day30] 持续整合与部署 - 我与 ASP.NET Core 3 的 30天

在现代化的网站开发中,逐渐也趋向将交付的功能切小,并频繁交付,使开发出来的功能可以小部分小部分快速确...