二叉树4-二叉树展开为链表、对称二叉树、合并两个有序链表、构造二叉树

14. 二叉树展开为链表

思路:递归,将子树展开为链表。根节点右节点为左节点,左节点的右节点为右节点,左节点设为空。
错误代码:

class Solution {
public:
    void flatten(TreeNode* root) {
        if(!root)
            return;
        if(root->left)
        {
            TreeNode* t1=root->left;
            TreeNode* t2=root->right;
            if(root->right)
            {
                root->right=t1;
                t1->right=t2;
                root->left=nullptr;
            }
            else
            {
                root->right=root->left;
                root->left=nullptr;
            }
        }
        flatten(root->left);
        flatten(root->right);
    }
};

错误原因:
递归不会写,思路不清晰。
正确代码:

class Solution {
public:
    void flatten(TreeNode* root) {
        if(!root)
            return;
//将根节点的左子树变成链表
        flatten(root->left);
 //将根节点的右子树变成链表
        flatten(root->right);
        TreeNode* t=root->right;
//把树的右边换成左边的链表
        root->right=root->left;
//把树的左边置空
        root->left=nullptr;
//把右边链表接到最右边
        while(root->right)
            root=root->right;
        root->right=t;
    }
};

递归表达式要放到哪里呀

101. 对称二叉树

思路是:如果镜像对称,那么遍历中-左-右和中-右-左得到的结果应该一样。
难点是如何递归?
错误代码:

class Solution {
public:
    bool compare(TreeNode* root1,TreeNode* root2)
    {
        if(root1->val==root2->val)
            return true;
        else
            return false;
        return compare(root1->left,root2->right);
        return compare(root1->right,root2->left);
    }
    bool isSymmetric(TreeNode* root) {
        TreeNode* root0=root;
        if(!root)
            return true;
        return compare(root0,root); 
    }
};

错误原因:
正确代码:
方法一:递归法

class Solution {
public:
    bool compare(TreeNode* root1,TreeNode* root2)
    {
        if(!root1&&!root2)
            return true;
        if(!root1||!root2)
            return false;
        return (root1->val==root2->val)&&compare(root1->left,root2->right)&&compare(root1->right,root2->left);
    }
    bool isSymmetric(TreeNode* root) {
        if(!root)
            return true;
        return compare(root,root); 
    }
};

方法二:迭代法
初始化时我们把根节点入队两次。每次提取两个结点并比较它们的值(队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像),然后将两个结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者我们检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束。

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(!root)
            return true;
        queue<TreeNode*> s;
        s.push(root);
        s.push(root);
        while(!s.empty())
        {
            TreeNode* p=s.front();s.pop();
            TreeNode* q=s.front();s.pop();
            if(!p&&!q)
                continue;
            if((!p&&q)||(p&&!q)||(p->val!=q->val))
                return false;
            s.push(p->right);
            s.push(q->left);

            s.push(p->left);
            s.push(q->right);
        }
        return true;
    }
};

21 . 合并两个有序链表

错误代码:

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if(!l1)
            return l2;
        if(!l2)
            return l1;
        while(l1->val>=l2->val)
        {
            ListNode* t=l2->next;
            l2->next=mergeTwoLists(l1,t);
        }
        while(l1->val<l2->val)
        {
            ListNode* t=l1->next;
            l1->next=mergeTwoLists(t,l2);
        }
        return l1;
    }
};

错误原因:不知道最后返回什么??
正确代码:

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if(!l1)
            return l2;
        if(!l2)
            return l1;
        //自顶向下
        //头结点为l2
        if(l1->val>=l2->val)
        {
            //l2在前,比较l1和l2->next
            l2->next=mergeTwoLists(l1,l2->next);
            return l2;
        }
        //头结点为l1
        else
        {
            //l1在前,比较l1->next和l2
            l1->next=mergeTwoLists(l1->next,l2);
            return l1;
        }
    }
};

105. 从前序与中序遍历序列构造二叉树

完全没思路!根据根节点和左节点的位置顺序?如何构造?从下到上?
思路:
1、首先前序定位根节点;
2、在中序遍历找出对应根节点,并分辨出左右子树;
3、求左右子树长度,在前序遍历中找出子树;
4、递归。
逐个在前序找。然后中序找出索引。把那个索引的值的左边数组看为左子树,右边数组为右子树。

class Solution {
public:
    int indexit(vector<int>& vec,int p)
    {
        vector<int>::iterator it=find(vec.begin(),vec.end(),p);
        int dis=distance(vec.begin(),it);
        return dis;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.empty())
            return nullptr;
        TreeNode *newTree= new TreeNode(preorder[0]);//初始化根节点
        int loc=indexit(inorder,preorder[0]);//查找根节点在中序遍历中的位置
        int l1=loc,l2=preorder.size()-loc-1;//左子树、右子树的长度
        vector<int>leftTree(inorder.begin(),inorder.begin()+l1);//左子树结点中序
        vector<int>rightTree(inorder.end()-l2,inorder.end());//右子树结点中序

        vector<int>preleftTree(preorder.begin()+1,preorder.begin()+l1+1);//左子树前序
        vector<int>prerightTree(preorder.end()-l2,preorder.end());//右子树前序

        newTree->left=buildTree(preleftTree, leftTree);//递归子树
        newTree->right=buildTree(prerightTree, rightTree);
        return newTree;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容