题目:
给你一棵二叉搜索树请 按中序遍历将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。
输入: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]
分析:
简单介绍下二叉搜索树,二叉搜索树是一类特殊的二叉树,它的左子节点总是小于或等于根节点,而右子节点总是大于或等于根节点,二叉树的三种不同的深度优先搜索算法都适用于二叉搜索树,但中序遍历是解决二叉搜索树相关面试题最常用的思路,这是因为中序遍历按照节点值递增的顺序遍历二叉树的每个节点。
该题和中序非递归遍历思路大体一致,利用栈来实现,在此基础上增加了两个指针,一个指针是指向当前节点的前一个节点,目的是为了实现右连接,另一个指针是指向展平后二叉搜索树的根节点,因此将这个指针作为函数的返回值。
代码:
import java.util.Stack;
public class IncreasingBST {
public static TreeNode increasingBST(TreeNode root){
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
TreeNode prev = null;
TreeNode first = null;
while (cur != null || !stack.isEmpty()){
while (cur != null){
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
if (prev !=null){
prev.right = cur;
}else {
first = cur;
}
prev = cur;
cur.left = null;
cur = cur.right;
}
return first;
}
}