1、题干
给你一棵二叉搜索树,请 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。
示例 1:
输入:root = [5,3,6,2,4,null,8,1,null,null,null,7,9]
输出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]
示例 2:
输入:root = [5,1,7]
输出:[1,null,5,null,7]
提示:
- 树中节点数的取值范围是
[1, 100]
0 <= Node.val <= 1000
注意:本题与主站 897 题相同: https://leetcode-cn.com/problems/increasing-order-search-tree/
2、解法1-DFS+改变指针
深度遍历所有节点,在递归左子节点后构造新的二叉树,newRoot
用于记录新树的根节点,若newRoot
为空则赋值为当前节点,lastNode
用于记录新树的最后一个节点,若lastNode
有值则将其右子节点置为当前节点,然后将lastNode
置为当前节点,当前节点的左子节点置为空,最后返回newRoot
3、代码
var increasingBST = function (root) {
let newRoot = null, lastNode = null;
function dfs(node) {
if (!node) return;
dfs(node.left);
if (!newRoot) newRoot = node;
if (lastNode) lastNode.right = node;
lastNode = node;
node.left = null;
dfs(node.right);
}
dfs(root);
return newRoot;
};
4、执行结果
5、解法2-DFS+数组
深度遍历将节点按中序存入数组中,结束后对节点数组进行遍历,将当前节点的左子节点置空右子节点置为下一个数组元素,最后返回数组首个元素。
6、代码
var increasingBST = function (root) {
const arr = [];
function dfs(node) {
if (!node) return;
dfs(node.left);
arr.push(node);
dfs(node.right);
}
dfs(root);
for (let i = 0; i < arr.length; i++) {
arr[i].left = null;
arr[i].right = arr[i + 1] || null;
}
return arr[0];
};
7、执行结果
执行用时: 68 ms 内存消耗: 39.2 MB