剑指 Offer II 052. 展平二叉搜索树:
题目链接 :剑指 Offer II 052. 展平二叉搜索树
题目:
给你一棵二叉搜索树,请 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。
思路:
1、非递归变换
(1) 先DFS到最左叶子节点
(2) 再将左子树元素倒序出队列入集合,再遍历右子树
(3) 将集合中存储的节点进行变换,左子树遍历过了所以置空,当前节点变为前一个节点的右子树
AC代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
List<TreeNode> res=new ArrayList<>();
public TreeNode increasingBST(TreeNode root) {
Deque<TreeNode> d=new ArrayDeque<>();
while(!d.isEmpty()||root!=null)
{
//先DFS到最左叶子节点
while(root!=null)
{
d.add(root);
root=root.left;
}
//再将左子树元素倒序出队列入集合
root=d.pollLast();
res.add(root);
//向右遍历
root=root.right;
}
//将集合中存储的节点进行变换,左子树遍历过了所以置空,当前节点变为前一个节点的右子树
TreeNode dummyHead=new TreeNode(-1);
TreeNode cur=dummyHead;
for(TreeNode node:res)
{
node.left=null;
cur.right=node;
cur=node;
}
return dummyHead.right;
}
}