码迷,mamicode.com
首页 > 其他好文 > 详细

剑桥offer(11~20)

时间:2016-11-09 20:17:48      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:二叉树的镜像   队列   遍历   树的子结构   数据结构   依次   res   使用   turn   

11.题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:A包含B,遍历A,当A的一个节点和B相等,就一直遍历,直到B的节点为NULL。
 
技术分享
class Solution {
    bool isSubtree(TreeNode* pRootA, TreeNode* pRootB) {
        if (pRootB == NULL) return true;
        if (pRootA == NULL) return false;
        if (pRootB->val == pRootA->val) {
            return isSubtree(pRootA->left, pRootB->left)
                && isSubtree(pRootA->right, pRootB->right);
        } else return false;
    }
public:
    bool HasSubtree(TreeNode* pRootA, TreeNode* pRootB)
    {
        if (pRootA == NULL || pRootB == NULL) return false;
        return isSubtree(pRootA, pRootB) ||
            HasSubtree(pRootA->left, pRootB) ||
            HasSubtree(pRootA->right, pRootB);
    }
};
View Code

12.题目描述

操作给定的二叉树,将其变换为源二叉树的镜像。 
思路:使用swap函数
技术分享
class Solution {
public:
         //栈的非递归
     void Mirror(TreeNode *pRoot) {
         if (pRoot == NULL)return;
         stack<TreeNode*> st;
         TreeNode* p = NULL;
         st.push(pRoot);
         while (st.size())
         {
             p = st.top();
             st.pop();
             swap(p->left, p->right);
             if (p->left)st.push(p->left);
             if (p->right)st.push(p->right);
         }
     }  //队列的非递归
    void Mirror(TreeNode *pRoot) {
         if (pRoot == NULL)return;
         queue<TreeNode*> qu;
         TreeNode* p = NULL;
         qu.push(pRoot);
         while (qu.size())
         {
             p = qu.front();
             qu.pop();
             swap(p->left, p->right);
             if (p->left)qu.push(p->left);
             if (p->right)qu.push(p->right);
         }
    }
    //递归
    void Mirror(TreeNode *pRoot) {
         if (pRoot == NULL)return;
         swap(pRoot->left, pRoot->right);
         Mirror(pRoot->left);
         Mirror(pRoot->right);
    }
};
View Code

 

13.题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
思路:添加数据,删除第一行数据,然后逆转矩阵,直到最后。
http://www.cnblogs.com/yuguangyuan/p/5915442.html
主要是使用了vector的方法:删除erase,清空clear,指定大小resize,添加元素push_back.
 

14.题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
思路:觉得这个题,我没有理解。
技术分享
class Solution {
   stack<int> data;
    stack<int> mindata;
public:
    void push(int value) {
        data.push(value);
        if (mindata.size() <= 0){
            mindata.push(value);
        }
        else if (value < mindata.top()){
            mindata.push(value);
        }
        else if (value >= mindata.top()){
            mindata.push(mindata.top());
        }
    }
    void pop() {   
        data.pop();
        mindata.pop();
    }
    int top() {
        return mindata.top();
    }
    int min() {
        return mindata.top();
    }
};
View Code

 

 
 
 

剑桥offer(11~20)

标签:二叉树的镜像   队列   遍历   树的子结构   数据结构   依次   res   使用   turn   

原文地址:http://www.cnblogs.com/yuguangyuan/p/6048081.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!