第一章_二叉树打印_字符串__5个案例_2019-03-13

二叉树打印

1、按层次遍历书并打印,要求遍历完一层后换行
解决方法:利用一个队列qe和两个变量last和nlast

  • qe中存储了当前层和下一层的部分节点
  • last标记当前层的最后一个节点
  • nlast标记下一层的最后一个节点
    c++版代码如下:
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
#include <queue>
class TreePrinter {
public:
    vector<vector<int> > printTree(TreeNode* root) {
        // write code here
        vector<vector<int>> vec;
        TreeNode *last = root;
        TreeNode *nlast = NULL;
        TreeNode *node;
        queue<TreeNode*> qe;
        if(root == NULL )
            return vec;
        vector<int> temp;
        qe.push(last);
        while(! qe.empty()){
            node = qe.front();
            temp.push_back(node->val);
            qe.pop();
            if(node->left){
                nlast = node->left;
                qe.push(nlast);
            } 
            if(node->right){
                nlast = node->right;
                qe.push(nlast);
            } 
            if(node == last){
                vec.push_back(temp);
                temp.clear();
                last = nlast;
            }
        }
        return vec;
    }
};

2、二叉树的序列化和反序列化,分为先序,中序和后序三种
例如二叉树
1
2 3
4 5 6
7 8 9 10
的先序遍历序列为:
1!2!4!7!#!#!8!#!#!5!#!#!3!#!6!9!#!#!10!#!#!
其实就是先序(中序、后序)序列中,空节点用#占位,每个节点用!分割。

字符串

3、逆序(给出一个句子,将句子中的单词逆序)
解决方法:局部逆序技巧

  • 1、将整个句子逆序
  • 2、将句子中的每个单词逆序
    4、0~i的字符串移动到最右面
    解决方法:局部逆序技巧
  • 1、将0~i的字符串逆序。
  • 2、将i + 1~length(str) - 1的字符串逆序。
  • 3、将整个字符串逆序。
    5、判断str1是不是str2的旋转词(0~i的字符串移动到最右面之后得到的词)
  • 1、求str = str2 + str2的大字符串
  • 2、判断str1和str2是否等长
  • 3、若等长判断str是否是str的一部分
    6、字符串拼接后按字典顺序排序
    解决方法:通过两两比较(将两两拼接后的字符串按字典顺序排序靠前的字符串中的前面的字符串排在前面)将字符串排序(O(N)*O(log(N)))。
    两串旋转练习题
    如果对于一个字符串A,将A的前面任意一部分挪到后边去形成的字符串称为A的旋转词。比如A="12345",A的旋转词有"12345","23451","34512","45123"和"51234"。对于两个字符串A和B,请判断A和B是否互为旋转词。

给定两个字符串A和B及他们的长度lena,lenb,请返回一个bool值,代表他们是否互为旋转词。

测试样例:
"cdab",4,"abcd",4
返回:true

class Rotation {
public:
    bool chkRotation(string A, int lena, string B, int lenb) {
        // write code h ere
        //将字符串变为字符数组
        char aa[1000];
        string AA = A + A;
        int length_aa = AA.copy(aa, 999);
        aa[length_aa] = '\0';
        
        char bb[1000];
        string BB = B + B;
        int length_bb = BB.copy(bb, 999);
        bb[length_bb] = '\0';
        
        char a[1000];
        int length_a = A.copy(a, 999);
        a[length_a] = '\0';
        
        char b[1000];
        int length_b = B.copy(b, 999);
        b[length_b] = '\0';
        //此处为了证明AB互为旋转词,进行了两遍测试,实际上,只要A是B的旋转词,则B就一定是A的旋转词
        return getIndexof(aa, b, lena, lenb) && getIndexof(bb, a, lenb, lena);
    }
    bool getIndexof(char ab[], char a[], int lena, int lenb){    
        int i, j = 0, index = 0, mark = 0;
        if(lena != lenb)
            return false;
        else{
            
            for(i = 0; i < lena + lenb; i++){
                if(ab[i] == a[j]){
                    index = i;
                    mark = 1;
                }
                while(ab[i] == a[j]){
                    i++;
                    j++;
                    if(i >= lena + lenb || j >= lena)
                        break;
                }
                if(j >= lena){
                    return true;
                }
                else if(i >= lena + lenb){
                    return false;
                }
                //如果部分匹配,则需要回退主串索引
                if(mark == 1){
                    i = index;
                }
                mark = 0;
                //每次循环都要置目标串索引为0
                j = 0;
                
            }
            return false;
        }
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,063评论 6 510
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,805评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,403评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,110评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,130评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,877评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,533评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,429评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,947评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,078评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,204评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,894评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,546评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,086评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,195评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,519评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,198评论 2 357

推荐阅读更多精彩内容