原题链接:897. 递增顺序搜索树
解题思路:
-
使用中序遍历,即可按顺序获取到二叉搜索树的每个节点。
-
创建一个新树,用
leaf
表示其叶子节点。 -
每次遍历到节点时,都进行如下操作:
- 将遍历到的节点连接到
leaf.right
。 - 将
leaf
移动到leaf.right
,保持它一直指向叶子节点。 - 将
leaf.left
设置为null
,打断节点原有的连接,避免新树出现环。
- 将遍历到的节点连接到
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
var increasingBST = function (root) {
let dummy = new TreeNode() // 创建一个虚拟节点,dummy.right指向新树的根节点
let leaf = dummy // 创建leaf节点,其指向新树的叶子节点,初始值为dummy
// 使用中序遍历构建新树
function traversal (node) {
// 当遇到空节点则退出递归
if (!node) {
return null
}
// 向左子树遍历
traversal(node.left)
// 使用中序遍历,按顺序获取每个节点
// 将当前节点都连接到叶子节点的右子节点
leaf.right = node
// 将leaf向右子节点移动,用于连接下一个节点
leaf = leaf.right
// 将left设置为null,打断节点原有的连接,避免新树出现环
leaf.left = null
// 向右子树遍历
traversal(node.right)
}
traversal(root)
// dummy.right指向的是新树的根节点
return dummy.right
}