二叉树の把二叉树打印成多行&序列化二叉树

二叉树是一棵有层序的树,现在要求是把这棵树打印为每一层结点的值在一行

即如图形式:

使用数组形式的vector来存储每一行的元素,然后再将存有元素的vector存储到另一个vector里,这样打印出来的就是分别每一行元素

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
        vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int> > v;
            queue<TreeNode*> q;
            if(pRoot==NULL)
                return v;
            q.push(pRoot);
            while(!q.empty())
            {
                vector<int> vec;
                int i = 0,size = q.size();
                while(i++<size)
                {
                    TreeNode* cur = q.front();
                    q.pop();
                    vec.push_back(cur->val);
                    if(cur->left)
                        q.push(cur->left);
                    if(cur->right)
                        q.push(cur->right);
                }
                v.push_back(vec);
            }
            return v;
        }
};

序列化二叉树以及反序列化


#include<string>
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 == NULL)
			return NULL;
		string s;//使用字符串来存储序列化之后的
		Serialize(root, s);//序列化二叉树之后,将数值存到字符串里
		char* tmp = new char[s.length() + 1];//申请空间,以便拷贝
		int i;
		for (i = 0; i<s.length(); i++)
		{
			tmp[i] = s[i];
		}
		tmp[i] = '\0';
		return tmp;
	}
	//序列化二叉树
	void Serialize(TreeNode *root, string& str){
		if (root == NULL){
			str += '$';//如果子树为空则添加符号$作为标记
			return;
		}
		string r = to_string(root->val);//将二叉树的值转为字符串
		str += r;
		str += ',';
		//再分别去递归左右子树的
		Serialize(root->left, str);
		Serialize(root->right, str);
	}
	//反序列化二叉树  参数为字符串
	TreeNode* Deserialize(char *str) {
		if (str == NULL)
			return NULL;
		TreeNode* node = Deserial(&str);
		return node;
	}
	TreeNode* Deserial(char** str)
	{
		if (**str == '$')
		{
			++(*str);
			return NULL;//判断是否为特殊字符,如果是的话就返回空
		}

		//将读到的字符串的转化为整数
		int num = 0;
		while (**str != '\0' && **str != ','){
			num = num * 10 + ((**str) - '0');
			++(*str);
		}
		//重建二叉树
		TreeNode* root = new TreeNode(num);
		if (**str == '\0')
			return root;
		else
			(*str)++;
		root->left = Deserial(str);
		root->right = Deserial(str);
		return root;
	}
};


猜你喜欢

转载自blog.csdn.net/qq_36474990/article/details/80195582