数据结构和算法经典100题-第33题
2016-01-03 18:13
411 查看
题目要求:
二叉树的序列化和反序列化。二叉树被记录成文件的过程叫做二叉树的序列化,通过文件内容重建原理二叉树的过程叫做二叉树的反序列化。
请设计一种方案实现二叉树的序列化和反序列化。
题目解析:
用两种方法:
1.先序遍历法:
先序遍历二叉树序列化,先序遍历法重建二叉树。
2.层序遍历法:
层序遍历二叉树序列化,层序遍历法重建二叉树。
关键点:
空节点用#!表示,一个普通节点如1,用1!表示。其中!表示一个节点值的结束。
先序遍历和层序遍历的过程都比较基础,在这里就不详细叙述了。我下面直接给出两种方案的代码。
先序遍历二叉树序列化与反序列化:
层序遍历二叉树序列化与反序列化:
路漫漫其修远兮,吾将上下而求索…
二叉树的序列化和反序列化。二叉树被记录成文件的过程叫做二叉树的序列化,通过文件内容重建原理二叉树的过程叫做二叉树的反序列化。
请设计一种方案实现二叉树的序列化和反序列化。
题目解析:
用两种方法:
1.先序遍历法:
先序遍历二叉树序列化,先序遍历法重建二叉树。
2.层序遍历法:
层序遍历二叉树序列化,层序遍历法重建二叉树。
关键点:
空节点用#!表示,一个普通节点如1,用1!表示。其中!表示一个节点值的结束。
先序遍历和层序遍历的过程都比较基础,在这里就不详细叙述了。我下面直接给出两种方案的代码。
先序遍历二叉树序列化与反序列化:
struct Node { string value; Node *left; Node *right; Node(string value) {this->value = value;} ~Node() { }; }; // 层序遍历序列化和反序列化二叉树 string serialByPre(Node *head) { string res; if (!head) { res = "#!"; return res; } res = head->value + "!"; res += serialByPre(head->left); res += serialByPre(head->right); return res; } Node *reconPreOrder(queue<string> &Q) { string value = Q.front(); Q.pop(); if ("#" == value) { return NULL; } Node *head = new Node(value); head->left = reconPreOrder(Q); head->right = reconPreOrder(Q); return head; } Node *reconByPreString(const string &preStr) { queue<string> Q; int len = (int)preStr.size(); for (int i = 0; i < len; ++i) { string strTmp; if ('!' != preStr[i]) { strTmp += preStr[i]; } else { Q.push(strTmp); } } return reconPreOrder(Q); }
层序遍历二叉树序列化与反序列化:
// 层序遍历序列化和反序列化二叉树 string serialByLevel(Node *head) { string res; queue<Node*> Q; Q.push(head); while (!Q.empty()) { Node * tmp = Q.front(); Q.pop(); if (!tmp) { res += "#!"; } else { res += tmp->value; res += "!"; } if (!tmp->left) { Q.push(tmp->left); } if (!tmp->right) { Q.push(tmp->right); } } return res; } Node *generateNode(string &value) { if ("#" == value) { return NULL; } return new Node(value); } Node *reconBylevelString(const string &levelStr) { vector<string> strArr; int len = (int)levelStr.size(); for (int i = 0; i < len; ++i) { string strTmp; if ('!' != levelStr[i]) { strTmp += levelStr[i]; } else { strArr.push_back(strTmp); } } queue<Node*> queueNode; int index = 0; Node *head = new Node(strArr[index]); if ("#" != strArr[index]) { queueNode.push(head); } else { return NULL; } while (!queueNode.empty()) { Node *nodeTmp = queueNode.front(); queueNode.pop(); nodeTmp->left = generateNode(strArr[index++]); nodeTmp->right= generateNode(strArr[index++]); if (!nodeTmp->left) { queueNode.push(nodeTmp->left); } if (!nodeTmp->right) { queueNode.push(nodeTmp->right); } } return head; }
路漫漫其修远兮,吾将上下而求索…
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#数据结构之顺序表(SeqList)实例详解
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 数据结构之Treap详解
- 浅析STL中的常用算法