二叉树转化为双向链表(头尾不相连)

二叉树转化为双向链表(头尾不相连)

示图

在这里插入图片描述
注意:不创建任何新的结点,只能调整树中结点指针的指向,当转化完成以后,树中节点的左指针需要指向前驱,右节点需要指向后继节点

输入:{10,6,14,4,8,12,16}
输出:From left to right are:4,6,8,10,12,14,16;From right to left are:16,14,12,10,8,6,4;。
返回双向链表的头节点返回即可

思路:二叉搜索树特点:中序遍历之后的序列就是升序,所以对其进行中序遍历,然后将结点加入队列
中,之后逐个出队,先出队第一个元素(二叉树中最左侧元素),之后第一个元素的右孩子指向下一个元素,下一个元素的左孩子指向第一个元素;(这里的左孩子、右孩子分别是前驱节点、后继节点),之后将指针指向第一个孩子移动到第二个孩子,进行上述操作,直到队列为空

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
  public:
    queue<TreeNode*> queue;
    TreeNode* Convert(TreeNode* pRootOfTree) {
        if (!pRootOfTree)
            return nullptr;
        Mid_sort(pRootOfTree);
        TreeNode* head = queue.front();
        queue.pop();
        TreeNode* cur = head;
        while (!queue.empty()) {
            cout << queue.size() << endl;
            TreeNode* p = queue.front();
            queue.pop();
            cur->right = p;
            p->left = cur;
            cur = p;
        }
        //如果首位相连接使用下述代码
        // cur->right = head;
        // head->left = cur;
        return head;
    }
    //中序遍历
    void Mid_sort(TreeNode* pRootOfTree) {
        if (!pRootOfTree) return;
        Mid_sort(pRootOfTree->left);
        queue.push(pRootOfTree);
        Mid_sort(pRootOfTree->right);
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值