《剑指 Offer》专项突破版 - 面试题 52 : 展平二叉树(C++ 递归实现 + 迭代实现)

目录

前言

递归实现

迭代实现


 


前言

题目链接LCR 052. 递增顺序搜索树 - 力扣(LeetCode)

题目

给定一棵二叉搜索树,请调整节点的指针使每个节点都没有左子节点。调整之后的树看起来像一个链表,但仍然是二叉搜索树。例如,把下图 (a) 中的二叉搜索树按照这个规则展平之后的结果如下图 (b) 所示。

分析

先分析展平之后二叉树的特性。它仍然是一棵二叉搜索树,而且它除叶节点外每个节点都只有右子节点。由于二叉搜树中右子节点大于或等于它的父节点,因此调整之后的二叉搜索树从根节点开始顺着指向右子节点的指针向下经过的节点的值将是递增排序的

看起来需要按照节点的值递增的顺序遍历二叉搜索树中的每个节点,并将节点用指向右子节点的指针连接起来。这就容易让人联想到二叉树的中序遍历,只是在这里每遍历到一个节点要把前一个节点的指向右子节点的指针指向它


递归实现

class Solution {
public:
    TreeNode* increasingBST(TreeNode* root) {
        TreeNode* result = root;
        while (result->left)
        {
            result = result->left;
        }
​
        TreeNode* prev = nullptr;
        inOrder(root, prev);
        return result;
    }
private:
    void inOrder(TreeNode* root, TreeNode*& prev)
    {
        if (root == nullptr)
            return;
        
        inOrder(root->left, prev);
        root->left = nullptr;
        if (prev != nullptr)
            prev->right = root;
        
        prev = root;
        inOrder(root->right, prev);
    }
};

 


迭代实现

class Solution {
public:
    TreeNode* increasingBST(TreeNode* root) {
        stack<TreeNode*> st;
        TreeNode* result = nullptr;
        TreeNode* prev = nullptr;
        TreeNode* cur = root;
        while (cur || !st.empty())
        {
            while (cur)
            {
                st.push(cur);
                cur = cur->left;
            }
​
            cur = st.top();
            st.pop();
            cur->left = nullptr;
            if (prev == nullptr)
                result = cur;
            else
                prev->right = cur;
            prev = cur;
            cur = cur->right;
        }
        return result;
    }
};
 
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值