1.两个栈实现一个队列:
建立两个栈STACK1,STACK2,入队就是PUSH—>stack1,出队就是pop->stack2,如果出队时stack2为空,stack1全部pop再push到stack2
//---------------------------------------------------------
2.两个队列实现一个栈:
我们把queue1的n-1个元素放到queue2中,queue中最后一个元素就是我们想要pop的元素,此时queue2存有n-1个元素(queue1为空)。在把queue2出队入队到queue1.
//---------------------------------------------------------
3.一个数组实现两个栈:
奇数下标为栈1,偶数下标为栈2.
//---------------------------------------------------------
//---------------------------------------------------------
4.二叉树的前序,中序,后序遍历
//二叉树定义
typedef struct BiTree {
DataType Data; //定义数据域
struct BiTree *LChild,*RChild; //定义左右子树的指针
} *BiTree;
//二叉树先序遍历
void PreTraverse(BiTree root) {
if(root!=NULL) {
Visit(root->data); //访问根节点
PreTraverse(root->LChild); //先序遍历左子树
PreTraverse(root->RChild); //先序遍历右子树
)
}
//---------------------------------------------------------
5.二叉树从顶部开始逐层打印二叉树结点数据,队列遍历法
设置一个队列,然后只要队列不为空,将对首元素的左右孩子加入队列(如果左右孩子不为空),然后将队列的首元素出对即可。
queue[rear++] = root;
while(队列front != rear) {
element = queue[front--];
if(element->lchild)
queue[rear++]=element->lchild;
if(element->rchild)
quue[rear++]=element->rchild;
}
//---------------------------------------------------------
6.栈遍历二叉树
以中序遍历为例:
void InOrderTraverse(BiTree root) {
InitStack(&s); //初始化栈s
p=root;
while( p!=NULL || !IsEmpty(s) ) { //当前访问节点存在或栈不空
if(p!=NULL) { //当前节点存在
Push(&s,p); //把当前节点压入栈顶
p=p->LChild; //继续遍历左子树
}
else { //当前节点不存在,回溯
Pop(&s,&p); //将栈顶赋给p,出栈
Visit(p->data); //访问节点p
p=p->RChild; //转而访问右子树
}
}
}
//---------------------------------------------------------
7.二叉树的深度
int FindTreeDeep(BinTree BT){
2 int deep=0;
3 if(BT){
4 int lchilddeep=FindTreeDeep(BT->lchild);
5 int rchilddeep=FindTreeDeep(BT->rchild);
6 deep=lchilddeep>=rchilddeep?lchilddeep+1:rchilddeep+1;
7 }
8 return deep;
9 }
建立两个栈STACK1,STACK2,入队就是PUSH—>stack1,出队就是pop->stack2,如果出队时stack2为空,stack1全部pop再push到stack2
//---------------------------------------------------------
2.两个队列实现一个栈:
我们把queue1的n-1个元素放到queue2中,queue中最后一个元素就是我们想要pop的元素,此时queue2存有n-1个元素(queue1为空)。在把queue2出队入队到queue1.
//---------------------------------------------------------
3.一个数组实现两个栈:
奇数下标为栈1,偶数下标为栈2.
//---------------------------------------------------------
//---------------------------------------------------------
4.二叉树的前序,中序,后序遍历
//二叉树定义
typedef struct BiTree {
DataType Data; //定义数据域
struct BiTree *LChild,*RChild; //定义左右子树的指针
} *BiTree;
//二叉树先序遍历
void PreTraverse(BiTree root) {
if(root!=NULL) {
Visit(root->data); //访问根节点
PreTraverse(root->LChild); //先序遍历左子树
PreTraverse(root->RChild); //先序遍历右子树
)
}
//---------------------------------------------------------
5.二叉树从顶部开始逐层打印二叉树结点数据,队列遍历法
设置一个队列,然后只要队列不为空,将对首元素的左右孩子加入队列(如果左右孩子不为空),然后将队列的首元素出对即可。
queue[rear++] = root;
while(队列front != rear) {
element = queue[front--];
if(element->lchild)
queue[rear++]=element->lchild;
if(element->rchild)
quue[rear++]=element->rchild;
}
//---------------------------------------------------------
6.栈遍历二叉树
以中序遍历为例:
void InOrderTraverse(BiTree root) {
InitStack(&s); //初始化栈s
p=root;
while( p!=NULL || !IsEmpty(s) ) { //当前访问节点存在或栈不空
if(p!=NULL) { //当前节点存在
Push(&s,p); //把当前节点压入栈顶
p=p->LChild; //继续遍历左子树
}
else { //当前节点不存在,回溯
Pop(&s,&p); //将栈顶赋给p,出栈
Visit(p->data); //访问节点p
p=p->RChild; //转而访问右子树
}
}
}
//---------------------------------------------------------
7.二叉树的深度
int FindTreeDeep(BinTree BT){
2 int deep=0;
3 if(BT){
4 int lchilddeep=FindTreeDeep(BT->lchild);
5 int rchilddeep=FindTreeDeep(BT->rchild);
6 deep=lchilddeep>=rchilddeep?lchilddeep+1:rchilddeep+1;
7 }
8 return deep;
9 }