热门IT资讯网

C++二叉搜索树与双向链表(剑指Offer精简版)

发表于:2024-11-24 作者:热门IT资讯网编辑
编辑最后更新 2024年11月24日,题目:输入一棵二叉搜索树,将该二叉搜素树转换成一个排序的双向链表。二叉树节点定义如下:struct TreeNode { int val; struct TreeNode *left;

题目:输入一棵二叉搜索树,将该二叉搜素树转换成一个排序的双向链表。
二叉树节点定义如下:

struct TreeNode {    int val;    struct TreeNode *left;    struct TreeNode *right;    TreeNode(int x) :            val(x), left(NULL), right(NULL) {    }};

解题思路:
由于通过中序排序可以转化为双向链表,因此,通过中序遍历的方法(左根右)的递归方法可以解决问题,解决完之后,pList节点指向双向链表的尾结点,pList节点需要通过遍历,返回到头节点,同样,我们也可以通过逆向中序遍历的方法之间完成,代码如下:

class Solution {public:    TreeNode* Convert(TreeNode* pRootOfTree)    {        TreeNode* pList=nullptr;//双向链表的头节点        Convert(pRootOfTree,pList);        return pList;    }    void Convert(TreeNode* pRootOfTree,TreeNode*& pList)    {        if(pRootOfTree==nullptr)//递归的出口            return;        if(pRootOfTree->right!=nullptr)//递归处理右子树            Convert(pRootOfTree->right,pList);        pRootOfTree->right=pList;//right相当于pNext        if (pList != nullptr)            pList->left = pRootOfTree;//left相当于pPre        pList = pRootOfTree;//pList节点从尾结点依次移动到头节点        if (pRootOfTree->left != nullptr)//递归处理左子树            Convert(pRootOfTree->left, pList);    }};
0