二叉树转换成双向链表

本文介绍了如何使用递归方法将一个搜索二叉树转换成有序的双向链表,详细阐述了思路并提供了相关代码实现。

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

二叉树转换成双向链表

题目:
将一个搜索二叉树转换成一个有序的双向链表

思路:
具体用递归的思想,用当前函数的指针节点与左子树的双向循环链表的尾节点进行指针的指向更新,当前的指针节点与右子树的双向循环链表的头结点进行指针的指向更新,最后递归函数返回值为当前形成的双向循环链表的尾节点。
具体代码如下:

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;

typedef struct node{
    node* left;
    node* right;
    int data;

}node,*pnode, *root;

//层次遍历打印 
void printTree(pnode n)
{
    queue<pnode> q;
    if(n != NULL)
    {
        q.push(n);
    }
    while(!q.empty())
    {
        pnode p = q.front();
        q.pop();
        cout<<p->data<<"\t";
        if(p->left != NULL)
            q.push(p->left);
        if(p->right != NULL)
            q.push(p->right);
    }
    cout<<endl;

}

//递归函数 
pnode treeToDoubleList(pnode n)
{
    if(n!= NULL)
    {   
        pnode retNode = n;//初始化当前点返回的节点 
        pnode right1 = treeToDoubleList(n->left);
        //更新左子树双向链表最后一个节点与当前点的指针指向 
        n->left = right1;   
        if(right1 != NULL)
            right1->right = n;

        pnode right2 = treeToDoubleList(n->right);
        //更新右子树双向链表最前面的节点与当前点的指针指向 
        pnode p = right2;
        if(p != NULL)
        {
            retNode = p;//如果不为空那么返回的节点就是右子树的双向链表的最后一个节点 
            while(p->left != NULL)//找到最左边的节点 
                p = p->left;
            p->left = n;
        }
        n->right = p;
        return retNode;
    }
    return NULL;
}

void printDoubleList(pnode n)
{
    pnode p = n;
    while(p->left!= NULL)
        p = p->left;
    while(p!=NULL)
    {
        cout << p->data << "\t";
        p = p->right;
    }   
}

//插入节点 
void InsertNode(pnode n, int a)
{
    if(n!=NULL)
    {
        pnode tmp=new node;
        tmp->left = NULL;
        tmp->right = NULL;
        tmp->data = a;
        if(n->data > a )
        {
            if(n->left != NULL)
                InsertNode(n->left, a);
            else
                n->left = tmp;
        }   

        else 
        {

           if(n->right != NULL)
                InsertNode(n->right, a);
            else
                n->right = tmp;
        }
    }
}

//构造树 
root ConstructTree(int a[], int len)
{
    int i;
    root r = new node;
    r->left = NULL;
    r->right = NULL;
    if(r!=NULL)
    {
        if(len>0)
            r->data = a[0];
        for(i=1;i<len;i++)
        {
            InsertNode(r,a[i]);
        }
        return r;   
    }   
    return NULL;
}


int main()
{
    int a[] = {4,2,6,1,3,5,7};
    root r = ConstructTree(a,7);
    if(r!=NULL)
        printTree(r);
    treeToDoubleList(r);
    printDoubleList(r);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值