剑指offer24-25解题思路及代码(二叉树中和为某一值的路径、复杂链表的复制)

剑指offer24-25解题思路及代码(二叉树中和为某一值的路径、复杂链表的复制)_第1张图片
24 二叉树中和为某一值的路径
class Solution {
public:
    vector > FindPath(TreeNode* root,int expectNumber) {
        vector> answer;
        if(root->val>expectNumber)
            return answer;
        if(root->left){
            int sum=root->val;
            vector left=FindNumb(root->left,expectNumber,sum);
        }
    }
    vector FindNumb(TreeNode* root,int expectNumber,int sum){
        vector left;
        sum+=root->val;
        if(sum>expectNumber)
            return left;
        if(sumval);
            if(root->left)
                vector<>
        }
    }
};
先写了一段,然后发现写不下去了,看来看参考答案,大体思路问题不大,主要该树并不是搜索树,所以判断大于小于没有任何意义,只需要判断是否有左子树和右子树并且是否相等即可。代码如下:
class Solution {
private:
    vector> answer;
    vector path;
public:
    vector > FindPath(TreeNode* root,int expectNumber) {
        if(root->val>expectNumber||root==NULL)
            return answer;
        path.push_back(root->val);
        if(expectNumber-root->val==0&&root->left==NULL&&root->right==NULL){
            answer.push_back(path);
        }
        if(root->left)
        FindPath(root->left,expectNumber-root->val);
        if(root->right)
            FindPath(root->right,expectNumber-root->val);
        if(path.size()!=0)
            path.pop_back();
        return answer;
    }

};


剑指offer24-25解题思路及代码(二叉树中和为某一值的路径、复杂链表的复制)_第2张图片
25 复杂链表得复制
程序得结构体比较长,主要是采用将链表先进行复制,并将其贴在其链表边上形成AA1BB1型,第二步将其复杂节点得指向也复制过来,最后将链表拆分为原链表和新构成得链表。话说结构长是容易出问题,有时候括号位置出问题和某些语句出错根本找不到问题出在哪里,一句RandomListNode* pCloned=new RandomListNode(pNode->label);里面得pNode写成了pCloned造成得数组越界竟然找了我半小时。。。
class Solution {
public:
     RandomListNode* Clone(RandomListNode* pHead){
            CloneNode(pHead);
            CloneRandomNode(pHead);
            return ReClone(pHead);
    }
    void CloneNode(RandomListNode* pHead){
        RandomListNode* pNode=pHead;
        while(pNode!=NULL){
            RandomListNode* pCloned=new RandomListNode(pNode->label);
            pCloned->next=pNode->next;
            pCloned->random=NULL;
            pNode->next=pCloned;
            pNode=pCloned->next;
        }
    }
    void CloneRandomNode(RandomListNode* pHead){
        RandomListNode* pNode=pHead;
        while(pNode){
            RandomListNode* pNext=pNode->next;
            if(pNode->random!=NULL)
            pNext->random=pNode->random->next;
            pNode=pNext->next;
        }
    }
        RandomListNode* ReClone(RandomListNode* pHead){
            RandomListNode* pNode=pHead;
            RandomListNode* pClonedHead=NULL;
            RandomListNode* pClonedNode=NULL;
            if(pNode){
                pClonedHead=pClonedNode=pNode->next;
                pNode->next=pClonedNode->next;
                pNode=pNode->next;
            }
            while(pNode){
                pClonedNode->next=pNode->next;
                pClonedNode=pNode->next;
                pNode->next=pClonedNode->next;
                pNode=pClonedNode->next;
            }
            return pClonedHead;
    }
};

你可能感兴趣的:(剑指offer24-25解题思路及代码(二叉树中和为某一值的路径、复杂链表的复制))