剑指offer:DAY3

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

解题思路:左子树区间的所有结点值 < 根结点值 < 右子树区间所有结点值。每棵子树的根结点肯定在后序遍历该子树的最后一个值。

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        //判断方法:子树区间的所有结点值 < 根结点值 < 右子树区间所有结点值
        //每棵子树的根结点肯定在后序遍历该子树的最后一个值
        
        if(sequence.empty())
            return false;
        return isBST(sequence,0,sequence.size()-1);
    }
    
    bool isBST(vector<int> seq,int start,int end)
    {
        
        if(start>=end)
            return true;
        int tmp=seq[end];
        int record=start;
        
        for(;seq[record]<seq[end];record++);
        for(int i=record;i<end;i++)
        {
            if(seq[i]<seq[end])
                return false;
            
        }
        return isBST(seq,0,record-1)&&isBST(seq,record,end-1);
    }
};

题目描述

输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)

class Solution {
public:
    vector<vector<int>> vec;
    vector<int> tmp;
    
    vector<vector<int> > FindPath(TreeNode* root,int exp) {
     //求出所有根结点到叶结点的路径
     //将总数减去每一个结点,在叶结点等于0时,即为正确的路径
        if(root==NULL)
            return vec;
        tmp.push_back(root->val);
        if((exp-root->val==0&&root->left==NULL&&root->right==NULL))
        {
            vec.push_back(tmp);
        }
        FindPath(root->left,exp-root->val);
        FindPath(root->right,exp-root->val);
        if(tmp.size()!=0)//右结点pop出去,递归上一个结点
            tmp.pop_back();
        
        return vec;
    }

};

 

题目描述:复杂链表的复制

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

解题思路:

class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead)
    {
        if(pHead==NULL)
            return NULL;
        nodeClone(pHead);
        connectRandom(pHead);
        return reconnect(pHead);
    }
    //复制结点,新结点接入旧结点的next中
    void nodeClone(RandomListNode* head)
    {
        RandomListNode* pNode=head;
        while(pNode!=NULL)
        {
            //RandomListNode* pClone=pNode;//克隆结点
            RandomListNode *pClone = new RandomListNode(pNode->label);
            pClone->next=pNode->next;
            pNode->next=pClone;
            pNode=pClone->next;

        }
    }
    //新结点连接random
    void connectRandom(RandomListNode* head)
    {
        RandomListNode* pNode=head;
        while(pNode !=NULL)
        {
            RandomListNode* pClone=pNode->next;
            if(pNode->random!=NULL)
                pClone->random=pNode->random->next;
            pNode=pClone->next;
            
        }
    }
    
    //分离新旧结点
    RandomListNode* reconnect(RandomListNode* head)
    {
        RandomListNode* pNode=head;
        RandomListNode* result=head->next;
        while(pNode!=NULL)//断开新旧结点之间的连接
        {
            RandomListNode* pClone=pNode->next;
            pNode->next=pClone->next;
            pNode=pNode->next;
            if (pNode != NULL)
                pClone->next = pNode->next;//改变新结点的指向!!!!
         
        }
        return result;
    }

};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章