剑指Offer——面试题25:二叉搜索树与双向链表

本文介绍如何将二叉搜索树转换为排序的双向链表,采用非递归中序遍历的方法,通过调整树中节点指针实现转换,无需创建新节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉搜索树与双向链表


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

输入:”10,6,14,4,8,12,16”

输出:从左往右读是”4,6,8,10,12,14,16”,从右往左读是”16,14,12,10,8,6,4”

思路:主要利用非递归的中序遍历的方式,将二叉搜索树进行中序遍历
那么,此时,二叉搜索树就成为一个排序后的节点了,再将它们链接起来即可。

/*
题目:非递归的中序遍历
思路:利用栈的数据结构,将左边的节点依次存入栈中,利用栈的先进后出方法,将该最左边的节点输出后,
     再判断该节点是否有右子数,有的话,继续上面操作,依次输出即可。
代码如下:
*/
while (pNode != NULL || !treeStack.empty()) {
   while (pNode != NULL) {
       treeStack.push(pNode);
       pNode = pNode->left;
   }

   if (!treeStack.empty()) {
       pNode = treeStack.top();
       treeStack.pop();
       cout<<"输出该节点的信息为:"<<pNode->val;
       pNode = pNode->right;
   }
}
/*
题目:二叉搜索树与双向链表
*/
class Solution {
public:
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if (pRootOfTree == NULL) {
            return pRootOfTree;
        }
        stack<TreeNode*> treeStack;
        TreeNode* pNode = pRootOfTree;
        bool isFirst = true;
        TreeNode* head;
        TreeNode* pPre = NULL;

        //非递归的中序遍历
        while (pNode != NULL || !treeStack.empty()) {
            while (pNode != NULL) {
                treeStack.push(pNode);
                pNode = pNode->left;
            }

            if (!treeStack.empty()) {
                pNode = treeStack.top();
                treeStack.pop();
                if (isFirst) {
                    head = pNode;
                    pPre = pNode;
                    isFirst = false;
                }
                else {
                    pNode->left = pPre;
                    pPre->right = pNode;
                    pPre = pNode;
                }
                pNode = pNode->right;
            }
        }
        return head;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值