package com.heu.wsq.leetcode.tree;
import java.util.Deque;
import java.util.LinkedList;
/**
* 897. 递增顺序查找树
* @author wsq
* @date 2020/12/21
* 给你一个树,请你 按中序遍历 重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。
*
* 示例 :
* 输入:[5,3,6,2,4,null,8,1,null,null,null,7,9]
* 5
* / \
* 3 6
* / \ \
* 2 4 8
* / / \
* 1 7 9
*
* 输出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]
*
* 链接:https://leetcode-cn.com/problems/increasing-order-search-tree
*/
public class IncreasingBST {
/**
* 使用辅助栈空间完成中序遍历,并修改原来树的结构,不使用额外的空间
* @param node
* @return
*/
public TreeNode increasingBST(TreeNode node){
TreeNode root = null;
TreeNode tempNode = null;
Deque<TreeNode> stack = new LinkedList<>();
stack.push(node);
boolean findRoot = true;
while (!stack.isEmpty()){
TreeNode peek = stack.peek();
if (peek.left != null){
stack.push(peek.left);
peek.left = null;
continue;
}
if (findRoot){
root = peek;
tempNode = root;
findRoot = false;
if (root.right != null){
stack.push(root.right);
}
continue;
}
TreeNode pop = stack.pop();
tempNode.right = pop;
tempNode = tempNode.right;
if (pop.right != null){
stack.push(pop.right);
}
}
return root;
}
}