二叉搜索树转成递增顺序搜索树
题目(力扣897题)
给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。
方法一:中序遍历后生成新的树
1,先将二叉搜索树根据中序遍历,结果保存在一个列表
2,根据列表的节点值,创建只有右节点的二叉搜索树,也就是根据节点值创建链表
代码实现
public TreeNode increasingBST(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
//中序遍历
inorder(root, res);
//带有虚拟头节点的链表
TreeNode dummyHead = new TreeNode(-1);
TreeNode cur = dummyHead;
for(int value:res){
cur.right = new TreeNode(value);
cur = cur.right;//向下一节点走
}
return dummyHead.right;
}
public void inorder(TreeNode node, List<Integer> res) {
if (node == null) {
return;
}
inorder(node.left, res);
res.add(node.val);
inorder(node.right, res);
}
方法二:中序遍历过程中修改结点指向
1,先进行中序遍历,修改结点指向
2,当我们遍历到一个节点时,把它的左孩子设为空,并将其本身作为上一个遍历到的节点的右孩子
代码实现
class Solution {
private TreeNode resNode;
public TreeNode increasingBST(TreeNode root) {
TreeNode dummyNode = new TreeNode(-1);
resNode = dummyNode;
inorder(root);
return dummyNode.right;
}
public void inorder(TreeNode node) {
if (node == null) {
return;
}
inorder(node.left);
// 在中序遍历的过程中修改节点指向
resNode.right = node;
node.left = null;
resNode = node;
inorder(node.right);
}
}