zoukankan      html  css  js  c++  java
  • 二叉树的按行层序遍历及序列化和反序列化

    1.二叉树的序列化

    序列化:如图,按前序进行序列化可得到字符串1!2!3!4!-1!-1!5!-1!-1!3!-1!-1!,其中!表示一个值的结束,-1表示该节点为空。

    反序列化:序列化的逆操作。

    附代码

    TreeNode* PreMakeTree(TreeNode* root,int value[])
    {
    //    ifsizeof(data)/sizeof(int)
        int e=value[k++];
        if(e==-1) root=NULL;
        else{
            root=(TreeNode*)malloc(sizeof(struct TreeNode));
            root->val=e;;
            root->left=PreMakeTree(root->left,value);
            root->right=PreMakeTree(root->right,value);
        }
        return root;
    }
    
    void PreOrder(TreeNode* root)
    {
        if(root!=NULL) {
            printf("%d!",root->val);
            PreOrder(root->left);
            PreOrder(root->right);
        }else
            printf("-1!");
    }

    2.二叉树的分层遍历

    1.维护last和nlast指针。

    2.开始时last=root

    3.队列每次入队更新nlast为当前入队结点

    4.当current=last时,进行换行操作,同时更新为nlast

    附代码

    void LevelOrder1(TreeNode* root)
    {
        TreeNode* last;
        TreeNode* nlast;
        queue<TreeNode*> q;
        q.push(root);
        last=root;
        while(!q.empty()){
            TreeNode* current=q.front();
            q.pop();
            printf("%d ",current->val);
    
            if(current->left!=NULL) {
                q.push(current->left);
                nlast=current->left;
            }
            if(current->right!=NULL) {
                q.push(current->right);
                nlast=current->right;
            }
    
            if(current==last) {
                printf("
    ");
                last=nlast;
            }
        }
    }
  • 相关阅读:
    AC自动机讲解超详细
    区间树Splay——[NOI2005]维护数列
    区间树Splay——[NOI2005]维护数列
    Trie学习总结
    微信小程序刮刮乐
    微信小程序获得高度
    微信小程序多video播放暂停问题
    vue中的问题思考
    vue的开发技巧
    微信小程序消息推送,前端操作
  • 原文地址:https://www.cnblogs.com/lshao/p/8984793.html
Copyright © 2011-2022 走看看