剑指offer学习笔记(7)--转换二叉搜索树为双向链表

考点:二叉搜索树、中序遍历、双向链表

题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。如图一个二叉树转换成排序的双向链表

思路分析

在搜索二叉树中,左节点的值总小于父节点,右节点的值总大于父节点;按中序遍历树的节点,得到的序列刚好是从小到大有序的。二叉树有两个指向子节点的指针,双向链表也是两个指针,一个向前,一个向后;把二叉树转换成双向链表时,原先指向左节点的指针指向链表中的前一个节点,原先指向右节点的指针指向链表中的后一个节点。

具体思路:

1.先中序遍历二叉搜索树,将结果放入数组中

2.再将数组转换为双向链表

上图中序遍历后序列为{4,6,8,10,12,14,16},存在容器vector list中,list是结点类型的。再修改指针连接即可。

实现代码

class Solution {
public:
    //中序遍历
    void mid(TreeNode* pRootOfTree,vector<TreeNode*> &list)
    {
        if(pRootOfTree==NULL)
            return;
        if(pRootOfTree->left!=NULL)
            mid(pRootOfTree->left,list);
        list.push_back(pRootOfTree);
        if(pRootOfTree->right!=NULL)
            mid(pRootOfTree->right,list);
    }
    //修改指针连接
    TreeNode* Convert_p(vector<TreeNode*> list)
    {
        for(int i=0;i<list.size()-1;i++){
            list[i]->right=list[i+1];
            list[i+1]->left=list[i];
        }
        return list[0];
    }
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if(pRootOfTree==NULL)
            return NULL;
        mid(pRootOfTree,list);
        return Convert_p(list);
    }
private:
    vector<TreeNode*> list;
};

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值