劍指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;
    }

};

 

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