leetcode 面试题 17.12. BiNode

新的思路

新思路没有超时,效果还行,如果想看我的旧思路记得拉到底下!本来不懂怎么做了,直到用中序遍历输出了一遍值,所以多试试总是有好处的hhhhh
题目解读:给一个二叉搜索树,将二叉搜索树转换成一个“树链表”,将值从大到小排列下去。
思路:从大到小排列值 -> 对二叉搜索树进行中序遍历就可以得到从大到小排列的值的列表 -> 将列表的这种形式用树替代即可
具体方法:

  1. 涉及到更改父节点和子节点的关系,我们需要借助一个prev指针来记住父节点。
  2. 第一个节点的记录最好用一个head,这样以来,prev也可以等于head
  3. 迭代方式:prev->right = root, prev = root
  4. 记得把每一个root->left = NULL

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* head = new TreeNode;
    TreeNode* prev = new TreeNode;
    bool flag = true;
    TreeNode* convertBiNode(TreeNode* root) {  
        TreeNode* temp = new TreeNode(-1); 
        dfs(root);
        return head->right;
    }

    void dfs(TreeNode* root){
        if(!root)
            return;
        dfs(root->left);
        
        // flag只用来初始化一次
        if(flag){
            head->right = root;
            prev = head;
            flag = false;
        }
        // 迭代prev
        prev->right = root;
        prev = root;
        root->left = NULL;
        
        dfs(root->right);
    }

};

复杂的旧思路(超时了有点尴尬)

给大家看一下可怕的最后一个测试例子(图没有截完整,还有很长……)
在这里插入图片描述

在这里插入图片描述

我画了图(我需要的结果图和题目图的差别)经过观察发现,这不就是AVL树的右旋吗?通过右旋可以交换子节点和父节点,且由于二叉搜索树的特殊性质,交换完正好是从大到小的顺序,于是就有了以下代码。

旧思路的代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* convertBiNode(TreeNode* root) {
        //递归超时了
        if(!root)
            return NULL;
        if(root->left)
        {
            root->left = convertBiNode(root->left);
            root = rightSingleRotation(root);
            root->left = NULL;   
        }
        if(root->right)
        {
            root->right = convertBiNode(root->right);
        }
        return root;
    }

    TreeNode* rightSingleRotation(TreeNode* root)
    {
        if(!root)
            return NULL;
        TreeNode* newRoot = root->left;
        root->left = newRoot->right;
        newRoot->right = root;
        return newRoot;
    }

};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值