Given the root of a binary search tree, rearrange the tree in in-order so that the leftmost node in the tree is now the root of the tree, and every node has no left child and only one right child.
Example 1:
Constraints:
The number of nodes in the given tree will be in the range [1, 100].
0 <= Node.val <= 1000
把二叉搜索树变成只有右子树的递增序二叉搜索树
思路:
中序遍历结果是升序的
可以把中序遍历值保存在一个list,再用list重建一个BST
class Solution {
List<Integer> nodeVals = new ArrayList<>();
public TreeNode increasingBST(TreeNode root) {
if(root == null) return null;
inOrderTraversal(root);
TreeNode newRoot = new TreeNode(nodeVals.get(0));
TreeNode cur = newRoot;
for(int i = 1; i < nodeVals.size(); i++) {
cur.right = new TreeNode(nodeVals.get(i));
cur = cur.right;
}
return newRoot;
}
void inOrderTraversal(TreeNode root) {
if(root == null) return;
inOrderTraversal(root.left);
nodeVals.add(root.val);
inOrderTraversal(root.right);
}
}
还可以直接在中序遍历时建立新的BST
先建一个临时的root,每次遍历到一个node,就把node置为新BST的右子树,但是注意node变为新BST的右子树前要先把node的左子树删掉,因为node的左右子树也是要带进新的BST的
刚开始建立的newRoot是临时的,所以最后要返回newRoot.right
class Solution {
TreeNode cur;
public TreeNode increasingBST(TreeNode root) {
if(root == null) return null;
TreeNode newRoot = new TreeNode(0);
cur = newRoot;
inOrder(root);
return newRoot.right;
}
void inOrder(TreeNode node) {
if(node == null) return;
inOrder(node.left);
node.left = null;
cur.right = node;
cur = node;
inOrder(node.right);
}
}