(8). 给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。下图为一棵有9个节点的二叉树。树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的用虚线表示
class Solution {
public:
vector<TreeLinkNode*> nodes;
TreeLinkNode* GetNext(TreeLinkNode* pNode) {
TreeLinkNode* root=pNode;
while(root->next)root=root->next;
InOrder(root);
int n=nodes.size();
for(int i=0;i<n;i++)
{
TreeLinkNode* cur=nodes[i];
if(cur==pNode)
{
return nodes[i+1];
}
}
return nullptr;
}
void InOrder(TreeLinkNode* root)
{
if(root==nullptr)return;
InOrder(root->left);
nodes.push_back(root);
InOrder(root->right);
}
};
解决这题主要就是三步,1.先根据next找到根节点
2.更加根节点进行中序遍历(左根右),可以使用递归方案,买也可以使用栈,队列都可以。
3.进行节点匹配,匹配后的下一个节点也就是所要找的节点。
(9). 用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。
class Solution
{
public:
//正常入栈
void push(int node) {
stack1.push(node);
}
int pop() {
//将第一个栈中元素内容pop出加入第二个栈中
while(!stack1.empty())
{
stack2.push(stack1.top());
stack1.pop();
}
//将第二个栈栈顶元素弹出
int res=stack2.top();
stack2.pop();
//将第二个栈的元素放回第一个栈
while(!stack2.empty())
{
stack1.push(stack2.top());
stack2.pop();
}
return res;
}
private:
stack<int> stack1;
stack<int> stack2;
};
解决这题主要是理解队列和栈的压入和弹出顺序,栈(先进后出),队列(先进先出)
使用栈实现队列,需要两个栈,一个用于压入,一个用于弹出。
1.压入,直接压入(push)栈1
2.其次是弹出,将栈1中元素弹出压入栈2,接着就弹出栈2的顶层元素也就是实现先进先出
3.将栈2中元素压入栈1中元素,下次使用时才能实现所有的都为先进先出。
(10),大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。
int Fibonacci(int n) {
// write code here
if(n==1||n==2)
{
return 1;
}
else {
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
这题根据给出函数编写程序就行。
(11),有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
int minNumberInRotateArray(vector<int> rotateArray) {
/*
int left=0;
int right=rotateArray.size()-1;
while(left<right)
{
int mid=(left+right)/2;
if(rotateArray[mid]>rotateArray[right])
{
left=mid+1;
}
else if(rotateArray[mid]==rotateArray[right])
{
right--;
}
else
{
right=mid;
}
}
return rotateArray[left];
*/
/*
int res=INT_MAX;
for(int i=0;i<rotateArray.size();i++)
{
res=min(res,rotateArray[i]);
}
return res;
*/
sort(rotateArray.begin(),rotateArray.end());
return rotateArray[0];
}
这题的解法,1.使用排序算法,第一个元素也就是所求元素。
2.遍历所有元素,找到最小元素。
3.使用二分法进行查找,找到最小元素。