56.题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
#include <iostream>
using namespace std;
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
ListNode*deleteDuplication(ListNode* pHead)
{
//如果链表为NULL,则返回NULL
if(pHead== NULL)
returnNULL;
deleteDuplicationCore(&pHead);
returnpHead;
}
voiddeleteDuplicationCore(ListNode **pHead)
{
if(*pHead== NULL || pHead == NULL)
return;
ListNode*pPre = NULL;
ListNode*pNode = *pHead;
while(pNode!= NULL)
{
ListNode*pNext = pNode->next;
boolbDel = false;
if(pNext!= NULL && pNext->val == pNode->val)
bDel= true;
if(!bDel)
{
pPre= pNode;
pNode= pNode->next;
}
else
{
intval = pNode->val;
ListNode*pToBeDel = pNode;
while(pToBeDel!= NULL && pToBeDel->val == val)
{
pNext= pToBeDel->next;
pToBeDel = pNext;
//deletepToBeDel;
//pToBeDel= NULL;
//pToBeDel= pNext;
}
if(pPre== NULL)
*pHead= pNext;
else
pPre->next= pNext;
pNode= pNext;
}
}
}
voidPrintList(ListNode * pHead)
{
if(pHead== NULL)
return;
while(pHead!= NULL)
{
cout<<pHead->val<<"";
pHead= pHead->next;
}
}
};
int main()
{
ListNodenode1(1);
ListNodenode2(2);
ListNodenode3(3);
ListNodenode4(3);
ListNodenode5(7);
ListNodenode6(4);
ListNodenode7(9);
node1.next= &node2;
node2.next= &node3;
node3.next= &node4;
node4.next= &node5;
node5.next= &node6;
node6.next= &node7;
Solutions;
ListNode*pList = s.deleteDuplication(&node1);
s.PrintList(pList);
return0;
}
57.题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
#include <iostream>
using namespace std;
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
//如果树为NULL
if(pNode == NULL)
returnNULL;
//如果有右孩子
TreeLinkNode*pNext = NULL;
if(pNode->right!= NULL)
{
TreeLinkNode*pRight = pNode->right;
while(pRight->left!= NULL)
{
pRight= pRight->left;
}
pNext= pRight;
}
//如果无右孩子
elseif(pNode->right == NULL)
{
TreeLinkNode*pCurrent = pNode;
TreeLinkNode*pParent = pNode->next;
while(pParent!= NULL && pParent->right == pCurrent)
{
pCurrent= pParent;
pParent= pParent->next;
}
pNext= pParent;
}
returnpNext;
}
voidLinkParent(TreeLinkNode *root)
{
if(root== NULL)
return;
if(root->left!= NULL)
root->left->next= root;
if(root->right!= NULL)
root->right->next= root;
LinkParent(root->left);
LinkParent(root->right);
}
TreeLinkNode*CreateTree()
{
intval;
cin>>val;
if(val== -1)
returnNULL;
TreeLinkNode*root = new TreeLinkNode(val);
root->left= CreateTree();
root->right= CreateTree();
returnroot;
}
voidPrePrintTree(TreeLinkNode *root)
{
if(root== NULL)
return;
cout<<root->val<<"";
PrePrintTree(root->left);
PrePrintTree(root->right);
}
voidMidPrintTree(TreeLinkNode *root)
{
if(root== NULL)
return;
MidPrintTree(root->left);
cout<<root->val<<"";
MidPrintTree(root->right);
}
};
int main()
{
freopen("data.txt","r",stdin);
Solutions;
TreeLinkNode*root = s.CreateTree();
s.LinkParent(root);
if(root!= NULL)
{
cout<<"后序:";
s.PrePrintTree(root);
}
else
cout<<"NULL";
cout<<endl;
if(root!= NULL)
{
cout<<"中序:";
s.MidPrintTree(root);
}
else
cout<<"NULL";
cout<<endl;
cout<<root->val<<"的下一个结点为:";
cout<<(s.GetNext(root))->val<<endl;
return0;
}
58.题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
#include <iostream>
using namespace std;
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot)
{
returnisSymmetrical(pRoot, pRoot);
}
boolisSymmetrical(TreeNode* pRoot1, TreeNode *pRoot2)
{
if(pRoot1== NULL && pRoot2 == NULL)
returntrue;
if(pRoot1== NULL || pRoot2 == NULL)
returnfalse;
if(pRoot1->val!= pRoot2->val)
returnfalse;
returnisSymmetrical(pRoot1->left, pRoot2->right) &&isSymmetrical(pRoot1->right, pRoot2->left);
}
TreeNode*CreateTree()
{
intval;
cin>>val;
if(val== -1)
returnNULL;
TreeNode*root = new TreeNode(val);
root->left= CreateTree();
root->right= CreateTree();
returnroot;
}
voidPrePrintTree(TreeNode *root)
{
if(root== NULL)
return;
cout<<root->val<<"";
PrePrintTree(root->left);
PrePrintTree(root->right);
}
voidMidPrintTree(TreeNode *root)
{
if(root== NULL)
return;
MidPrintTree(root->left);
cout<<root->val<<"";
MidPrintTree(root->right);
}
};
int main()
{
freopen("data.txt","r",stdin);
Solutions;
TreeNode*root = s.CreateTree();
if(root!= NULL)
{
cout<<"后序:";
s.PrePrintTree(root);
}
else
cout<<"NULL";
cout<<endl;
if(root!= NULL)
{
cout<<"中序:";
s.MidPrintTree(root);
}
else
cout<<"NULL";
cout<<endl;
if(s.isSymmetrical(root))
cout<<"对称"<<endl;
else
cout<<"不对称"<<endl;
return0;
}
59.题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
if(pRoot == NULL)
returnvector<vector<int> >(0);
vector<vector<int>> result;
stack<TreeNode*> st_TreeNode[2];
st_TreeNode[0].push(pRoot);
intnCurrent = 0;
intnNext = 1;
vector<int>vTemp;
while(!st_TreeNode[0].empty()|| !st_TreeNode[1].empty())
{
TreeNode*node = st_TreeNode[nCurrent].top();
st_TreeNode[nCurrent].pop();
vTemp.push_back(node->val);
if(nCurrent== 0)
{
if(node->left!= NULL)
{
st_TreeNode[nNext].push(node->left);
}
if(node->right!= NULL)
{
st_TreeNode[nNext].push(node->right);
}
}
else
{
if(node->right!= NULL)
{
st_TreeNode[nNext].push(node->right);
}
if(node->left!= NULL)
{
st_TreeNode[nNext].push(node->left);
}
}
if(st_TreeNode[nCurrent].empty())
{
nCurrent= 1 - nCurrent;
nNext= 1 - nNext;
result.push_back(vTemp);
while(!vTemp.empty())
vTemp.pop_back();
}
}
returnresult;
}
TreeNode*CreateTree()
{
intval;
cin>>val;
if(val== -1)
returnNULL;
TreeNode*root = new TreeNode(val);
root->left= CreateTree();
root->right= CreateTree();
returnroot;
}
voidPrePrintTree(TreeNode *root)
{
if(root== NULL)
return;
cout<<root->val<<"";
PrePrintTree(root->left);
PrePrintTree(root->right);
}
voidMidPrintTree(TreeNode *root)
{
if(root== NULL)
return;
MidPrintTree(root->left);
cout<<root->val<<"";
MidPrintTree(root->right);
}
};
int main()
{
freopen("data.txt","r",stdin);
Solutions;
TreeNode*root = s.CreateTree();
if(root!= NULL)
{
cout<<"后序:";
s.PrePrintTree(root);
}
else
cout<<"NULL";
cout<<endl;
if(root!= NULL)
{
cout<<"中序:";
s.MidPrintTree(root);
}
else
cout<<"NULL";
cout<<endl;
vector<vector<int>> result = s.Print(root);
vector<vector<int>>::iterator ite1 = result.begin();
vector<int>::iteratorite2 = ite1->begin();
cout<<"Z字型:"<<endl;
for(;ite1 != result.end(); ite1++)
{
cout<<" ";
for(ite2= ite1->begin(); ite2 != ite1->end(); ite2++)
{
cout<<*ite2<<"";
}
cout<<endl;
}
return0;
}
60.题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
if(pRoot == NULL)
returnvector<vector<int> >(0);
vector<vector<int>> result;
queue<TreeNode*> qu_TreeNode;
qu_TreeNode.push(pRoot);
intnSumCurLevel = 1;
intnSumNextLevel = 0;
vector<int>vTemp;
while(!qu_TreeNode.empty())
{
TreeNode*node = qu_TreeNode.front();
qu_TreeNode.pop();
vTemp.push_back(node->val);
if(node->left!= NULL)
{
qu_TreeNode.push(node->left);
nSumNextLevel++;
}
if(node->right!= NULL)
{
qu_TreeNode.push(node->right);
nSumNextLevel++;
}
nSumCurLevel--;
if(nSumCurLevel==0)
{
nSumCurLevel= nSumNextLevel;
nSumNextLevel= 0;
result.push_back(vTemp);
while(!vTemp.empty())
vTemp.pop_back();
}
}
returnresult;
}
TreeNode*CreateTree()
{
intval;
cin>>val;
if(val== -1)
returnNULL;
TreeNode*root = new TreeNode(val);
root->left= CreateTree();
root->right= CreateTree();
returnroot;
}
voidPrePrintTree(TreeNode *root)
{
if(root== NULL)
return;
cout<<root->val<<"";
PrePrintTree(root->left);
PrePrintTree(root->right);
}
voidMidPrintTree(TreeNode *root)
{
if(root== NULL)
return;
MidPrintTree(root->left);
cout<<root->val<<"";
MidPrintTree(root->right);
}
};
int main()
{
freopen("data.txt","r",stdin);
Solutions;
TreeNode*root = s.CreateTree();
if(root!= NULL)
{
cout<<"后序:";
s.PrePrintTree(root);
}
else
cout<<"NULL";
cout<<endl;
if(root!= NULL)
{
cout<<"中序:";
s.MidPrintTree(root);
}
else
cout<<"NULL";
cout<<endl;
vector<vector<int>> result = s.Print(root);
vector<vector<int>>::iterator ite1 = result.begin();
vector<int>::iteratorite2 = ite1->begin();
cout<<"Z字型:"<<endl;
for(;ite1 != result.end(); ite1++)
{
cout<<" ";
for(ite2= ite1->begin(); ite2 != ite1->end(); ite2++)
{
cout<<*ite2<<"";
}
cout<<endl;
}
return0;
}