【劍指offer{15-18}】反轉連結串列、合併兩個排序的連結串列、樹的子結構、二叉樹的映象
阿新 • • 發佈:2018-12-13
反轉連結串列、合併兩個排序的連結串列、樹的子結構、二叉樹的映象
反轉連結串列
題目描述
- 輸入一個連結串列,反轉連結串列後,輸出新連結串列的表頭。
C++程式碼
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* ReverseList(ListNode* pHead) { if(pHead==NULL) { return NULL; } ListNode *p = pHead; ListNode *q = pHead->next; pHead->next = NULL; ListNode *r = NULL; while(q) { r = q->next; q->next = p; p = q; q = r; } pHead = p; return pHead; } };
合併兩個排序的連結串列
題目描述
- 輸入兩個單調遞增的連結串列,輸出兩個連結串列合成後的連結串列,當然我們需要合成後的連結串列滿足單調不減規則。
C++程式碼
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { ListNode * head = NULL; if(pHead1==NULL) { return pHead2; } if(pHead2==NULL) { return pHead1; } if(pHead1->val>=pHead2->val) { head = pHead2; head->next = Merge(pHead1,pHead2->next); } if(pHead1->val<pHead2->val) { head = pHead1; head->next = Merge(pHead1->next,pHead2); } return head; } };
樹的子結構
題目描述
- 輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構
C++程式碼
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: bool Compare(TreeNode *root1,TreeNode *root2) { if(root2==NULL) { return true; } if(root1==NULL) { return false; } if(root1->val!=root2->val) { return false; } return Compare(root1->left,root2->left) && Compare(root1->right,root2->right); } bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { bool flag = false; if(pRoot1!=NULL && pRoot2!=NULL) { if(pRoot1->val==pRoot2->val) { flag = Compare(pRoot1,pRoot2); } if(!flag) { flag = HasSubtree(pRoot1->left,pRoot2); } if(!flag) { flag = HasSubtree(pRoot1->right,pRoot2); } } return flag; } };
二叉樹的映象
題目描述
- 操作給定的二叉樹,將其變換為源二叉樹的映象。
C++程式碼
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void Mirror(TreeNode *pRoot)
{
if(pRoot==NULL)
{
return;
}
TreeNode *ptemp = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = ptemp;
Mirror(pRoot->left);
Mirror(pRoot->right);
}
};