题解 | #二叉搜索树与双向链表#

二叉搜索树与双向链表

http://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5

第二十题 中序遍历 修改左右子树的链为双向链表 
是十二题的复杂版本 只写了递归的版本  非递归太复杂了
递归调用的中序遍历
利用preNode保存着前一项
当访问下一个结点的时候,更新 preNode的right和当前结点的left

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    // 保存前一个结点 在不同函数之间使用 要全局变量
    TreeNode* preNode;
    TreeNode* Convert(TreeNode* pRootOfTree) {
        // 原先就是中序遍历 创建双向链表
        // 但要求是不能创建新结点 只能在二叉树上修改
        // 所以在之前对于之前preNode要保存下来
        // 递归调用
        if(pRootOfTree == NULL)
            return pRootOfTree;
        
        TreeNode * ret_ans=pRootOfTree;
        // 返回的头结点 永远是最左下的那个点
        while(ret_ans->left!=NULL)
            ret_ans = ret_ans->left;
        
        // 中序遍历 递归调用
        zhongxvbianli(pRootOfTree);
        return ret_ans;

    }
    void zhongxvbianli(TreeNode* root){
        if(root ==NULL)
            return;
        
        // 中序遍历 左根右
        // 左子树先遍历 不然左边结点被修改了 就找不到了
        zhongxvbianli(root->left);
        
        // 根 修改left 和 right
        // 左边指向 前一个结点 前一个结点的右边 指向当前结点 4指向6;6指向4
        root->left=preNode;
        if(preNode!=NULL)
            preNode->right=root;
        preNode=root;
        
        // 右子树遍历
        zhongxvbianli(root->right);
        
    }
};

题解 文章被收录于专栏

一遍做剑指offer 一边保存做题步骤 并附带详细注释哦

全部评论

相关推荐

05-12 11:09
已编辑
门头沟学院 后端
已注销:没必要放这么多专业技能的描述。这些应该是默认已会的,写这么多行感觉在凑内容。项目这块感觉再包装包装吧,换个名字,虽然大家的项目基本都是网上套壳的,但是你这也太明显了。放一个业务项目,再放一个技术项目。技术项目,例如中间件的一些扩展和尝试。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
每晚夜里独自颤抖:你cet6就cet6,cet4就cet4,你写个cet证书等是什么意思。专业技能快赶上项目行数,你做的这2个项目哪里能提现你有这么多技能呢
点赞 评论 收藏
分享
码农索隆:这种hr,建议全中国推广
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务