二叉搜索树与双向链表28

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

解题思路:

  1. 二叉搜索树是排序的,双向链表前后都有指针。
  2. 在转换成双向链表时,原先指向左子节点的指针调整为链表中指向前一节点的指针, 原先指向右子节点的指针调整为链表中指向后一节点指针。
  3. 中序遍历,递归转换
    二叉树节点定义:
//二叉树结点定义
struct BinTreeNode{
  int m_value;
  BinTreeNode *left;
  BinTreeNode *right;
};

函数实现:

//辅助函数实现
void ConvertNode(BinTreeNode *pNode, BinTreeNode **pLastNodeInList){
    if(pNode == NULL)
        return;
    //当前结点
    BinTreeNode *pCurrent = pNode;
    //如果当前结点左子树不为空
    if(pCurrent->left != NULL)
        ConvertNode(pCurrent->left, pLastNodeInList); //转换左子树
    //当前左子树等于转换后的链表尾节点
    pCurrent->left = *pLastNodeInList;
    //如果尾节点不为空
    if(*pLastNodeInList != NULL)
        (*pLastNodeInList)->right = pCurrent;  //尾节点的左子树指向pCurrent
    *pLastNodeInList = pCurrent;
    //转换右子树
    if(pCurrent->right != NULL)
        ConvertNode(pCurrent->right, pLastNodeInList);
}

//主函数
BinTreeNode* Convert(BinTreeNode *pRootOfTree){
    //链表中的最后一个节点,将其指向已经转换好的链表的最后一个节点
    BinTreeNode *pLastNodeInList = new BinTreeNode;
    //辅助函数
    ConvertNode(pRootOfTree, &pLastNodeInList);
    //pLastNodeInList指向双向链表的尾节点
    //需要返回头节点
    BinTreeNode *pHeadOfList = pLastNodeInList;  //初始赋值为尾节点
    //循环找到头节点
    while(pHeadOfList != NULL && pHeadOfList->left != NULL)
        pHeadOfList = pHeadOfList->left; //最左侧节点即头节点
    return pHeadOfList;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值