使用层序遍历序列化和反序列化二叉树

本文介绍了一种二叉树的序列化与反序列化的实现方法,通过广度优先搜索遍历二叉树,并使用特定数值作为占位符来处理空节点的情况,实现了二叉树结构的有效编码与解码。

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

// write your code here cpp
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define LOCAL
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
        val(x), left(NULL), right(NULL) {
    }
};
class Solution {
public:
    char* Serialize(TreeNode *root) {   //这个返回参数这么诡异是因为这是牛客网上定义的

        if(!root)
            return NULL;      
        vector<int> tmp;
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty()){
            TreeNode* e = q.front();
            q.pop();
            if(!e) //如果为空指针
                tmp.push_back(0xFFFF); //有可能中间是空指针的情况,因为不一定是完全二叉树,要使用占位符
            else{
                tmp.push_back(e->val);
                q.push(e->left);
                q.push(e->right);    
            }

        }   
        int *result = new int[tmp.size()];
        memcpy(result, &tmp[0], tmp.size()*sizeof(int));
        return (char*)result;//转为字符指针

    }
    TreeNode* Deserialize(char *str) {

        if(!str)
            return NULL;

        int * p = (int*)str;         
        if(*p==0xFFFF)
            return NULL;
        queue<TreeNode*> e;

        TreeNode* root = new TreeNode(*p);//树的根节点   
        e.push(root);       

        while(!e.empty()){
            TreeNode* tmp = e.front();
            e.pop();//弹出头节点
            if(*(++p)!=0xFFFF){ //不为空节点
                tmp->left = new TreeNode(*p);
                e.push(tmp->left);              
            }
            else{
                tmp->left = NULL;
            }
            if(*(++p)!=0xFFFF){//不为空节点
                tmp->right = new TreeNode(*p);
                e.push(tmp->right);
            }         
            else
                tmp->right = NULL;


        }
        return root;

    }

};
int main(){

    TreeNode * n1 = new TreeNode(100);
    TreeNode * n2 = new TreeNode(50);
    TreeNode * n3 = new TreeNode(-1);
    TreeNode * n4 = new TreeNode(-1);
    TreeNode * n5 = new TreeNode(150);
    n1->left = n2;
    n1->right = NULL;
    n2->left = NULL;
    n2->right = n5;

    Solution s;
    char * ses = s.Serialize(n1);
    TreeNode* result = s.Deserialize(ses);

    return 0;   

}
可以使用队列来实现二叉树层序遍历,具体实现如下: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树结点 typedef struct TreeNode { int data; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 定义队列结点 typedef struct QueueNode { TreeNode* data; struct QueueNode* next; } QueueNode; // 定义队列 typedef struct Queue { QueueNode* front; QueueNode* rear; } Queue; // 初始化队列 void initQueue(Queue* Q) { Q->front = Q->rear = NULL; } // 判断队列是否为空 int isQueueEmpty(Queue* Q) { return Q->front == NULL; } // 入队 void enqueue(Queue* Q, TreeNode* data) { QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode)); newNode->data = data; newNode->next = NULL; if (Q->rear == NULL) { Q->front = Q->rear = newNode; } else { Q->rear->next = newNode; Q->rear = newNode; } } // 出队 TreeNode* dequeue(Queue* Q) { if (isQueueEmpty(Q)) { return NULL; } QueueNode* front = Q->front; TreeNode* data = front->data; Q->front = front->next; if (Q->front == NULL) { Q->rear = NULL; } free(front); return data; } // 创建二叉树 TreeNode* createTree() { int data; scanf("%d", &data); if (data == -1) { return NULL; } TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->data = data; root->left = createTree(); root->right = createTree(); return root; } // 层序遍历 void levelOrderTraversal(TreeNode* root) { Queue Q; initQueue(&Q); enqueue(&Q, root); while (!isQueueEmpty(&Q)) { TreeNode* node = dequeue(&Q); printf("%d ", node->data); if (node->left) { enqueue(&Q, node->left); } if (node->right) { enqueue(&Q, node->right); } } } int main() { TreeNode* root = createTree(); printf("层序遍历序列:"); levelOrderTraversal(root); printf("\n"); return 0; } ``` 在该程序中,我们首定义了二叉树结点 `TreeNode` 队列结点 `QueueNode`,以及队列 `Queue`。然后,我们实现了队列的基本操作,包括初始化队列、判断队列是否为空、入队出队。接着,我们实现了创建二叉树的函数 `createTree()` 层序遍历的函数 `levelOrderTraversal()`。其中,层序遍历使用队列来实现,从根节点开始,每次出队一个结点,将其左右子结点入队,直到队列为空为止。最后,我们在 `main()` 函数中调用 `createTree()` `levelOrderTraversal()` 函数,输出二叉树层序遍历序列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值