天天看点

C++程序员面试指南第10章

面试题1:链表和数组有什么区别

答案:数组和链表有以下几点不同。

(1) 存储形式:数组是一组连续的空间,声明时就要确定长度。链表是一块可不连续的动态空间,长度可变

,每个结点要保存相邻结点指针。

(2) 数据查找:数组的线性查找速度快,查找操作直接使用偏移地址。链表需要按顺序检索结点,效率低。

(3) 数据插入或删除:链表可以快速插入和删除结点,而数组可能需要大量数据移动。

(4) 越界问题:链表不存在越界问题,数组有越界问题。

面试题2:快速查找单链表的中间结点。

答案: 

typedef stuct NODE  //定义一个结点结构体
{
int a;
struct node *next;
} NODE;
NODE *middle(lnode *head)
{
NODE *fast,*slow,*p;   //定义三个结点指针,fast是快指针,slow是慢指针,p是临时指针
if(head == NULL)   //判断是否是空链表,是空则退出
{
return NULL;
}
fast=slow=head; //快和慢指针同时指向链表首结点


while(!(p=fast->next)&&!p->next)  //循环,直到快指针下个结点或下下个结点为空
{
slow=slow->next;  //慢指针走一步
fast=p->next; //快指针走两步
}
return slow;   //f返回中间结点
}
           

面试题3:怎样把一个单链表反序

答案:

(1)反转一个链表。循环算法

List reverse(List n)
{
if(!n)  //判断链表是否唯恐,为空即退出
{
return n;
} 
list cur = n.next; // 保存头结点的下一个结点
list pre = n;      //保存头结点
list tmp;
pre.next = null;   //头结点的指针为空,转换后变尾结点
while(NULL != cur.next) //循环直到cur.next为空
{
tmp = cur;  
tmp.next = pre;
pre = tmp;

cur = cur.next;
 } 
 return tmp;   //f返回头指针 
 } 
           

(2)反转一个链表。递归算法

List *reverse(List *oldList, List *newHead = NULL)
{
List *next = oldList->next; //记录上次反转后的链表
oldList->next = newHead; //将当前结点插入到反转后链表的开头
newHead = oldList;   //递归处理剩余的链表

return (next == NULL)? newHead:reverse(t,newHead);
 } 
           

面试题4:根据需求建立一个单向循环链表    

设计一个程序,用键盘输入的一些数字创建一个单向循环链表,求出链表长度,打印链表各个元素。之后可以根

据需求把这个循环链表改装成单向链表或带环的单向链表。

答案:

typedef struct node
{
int data;
struct node *next;
}Lnode, *LinkList;
void CreatLinkList(LinkList &L)
{
//建立一个单循环链表L,数据为整数
//数据由键盘随机输入
int i;
LinkList p1;
L = (LinkList)malloc(sizeof(struct node)); //申请新结点
p1 = L;
p1->next = L;
cout<<"please input the data of the node "<<endl;
<<"input 0 to end:";
cin>>i;  //读取数值
while(i)
{
LinkList p = (LinkList)malloc(sizeof(struct node)); //申请新结点
if(!p)
{
cout<<"allocation error"<<endl;
exit(1);
}
p->data = i;  //初始化新结点
p1->next = p; //插入新结点
p1 = p;
p1->next = L;
cout<<"please input the data of the node"<<endl;
<<"input 0 to end:";
cin>>i;
}
}
void PrintLinkList(LinkList L)    //输出单循环链表L的数据元素
{
LinkList temp = L->next;
cout<<"The List Is:"<<endl;
while(temp->next != L->next)
{
cout<<temp->data<<endl;
temp = temp->next;
}
}
int LinkListLength(LinkList L)   //计算单循环链表L的数据元素的个数
{
int i = 0;
LinkList temp = L->next;
while(temp->next != L->next)  //执行直到链表尾部
{
i++;
temp = temp->next;
}
return i;
}
void LinkListCircle(LinkList &L,int i,int LinkListLength)
{                         //将链表环化
LinkList p1,p2;
p1 = p2 = L->next;
for(int m = 0; m < LinkListLength-1; m++)
{
p1 = p1->next;
}
if(i == 0)
{
p1->next = NULL;
return;
}
for(m = 0; m < i-1; m++)   //寻找环起始点
{
p2 = p2->next;
}
p1->next = p2;
}
           

测试函数:

# include <iostream.h>
# include <stdlib.h>
# include <stdio.h>
void main()
{
LinkList L;
CreatLinkList(L);  //创建链表
PrintLinkList(L);  //打印链表
cout<<"链表长度为:"<<LinkListLength(L)<<endl;
int i = 0;
cout<<"请输入从第几个元素开始循环(0为非循环单链表):"<<endl;
cin>>i;
LinkListCircle(L,i,LinkListLength(L));  //链表环化
i = 0;
LinkList p1,p2;
p1 = L->next;
p2 = p1->next->next;
while(i < 25)
{
i++;
cout<<p1->data<<" ";
p1 = p1->next;
p2 = p2->next->next;
}
}
           

运行结果:

please input the data of the node
input 0 to end:1
please input the data of the node
input 0 to end:2
please input the data of the node
input 0 to end:3
please input the data of the node
input 0 to end:4
please input the data of the node
input 0 to end:5
please input the data of the node
input 0 to end:6
please input the data of the node
input 0 to end:0
The List Is:
1
2
3
4
5
6
           

链表长度为:6

请输入从第几个元素开始循环(0为非循环单链表):

3

1 2 3 4 5 6 3 4 5 6 3 4 5 6 3 4 5 6 3 4 5 6 3 4 5 

面试题5:检测一个较大的单向链表是否带环

答案:

bool research_cycleLink(LinkList headNode)
{
LinkList p1,p2;
bool result = false;  //返回链表是否带有循环


p1 = headNode;
if(p1->next == NULL)
{
printf("只存在一个结点!\n");
}
else if(p1->next->next == NULL)
{
printf("只存在两个结点!\n");
}
else
{
p2 = (p1->next)->next; //p2指向第三个结点
while((p1 != NULL) && (p2 != NULL))
{
if(p1 == p2)
{
result = true;  //p2赶上p1则链表带有循环
break;
}
else
{
if(p2->next ==NULL)
{
result = false;
break;
}
p1 = p1->next; //p1向后移一个结点
p2 = (p2->next)->next; //p2向后移两个结点
}
}                      //end while
}
return result;
}
           

面试题6:按要求构造一个双向链表

设计一个程序,用键盘输入一些数字创建一个双向链表,计算链表长度,并打印链表中各数据元素。

答案:

//节点结构体
typedef struct dnod
{
int data;   //节点数值
struct dnod *next;  //前结点指针
struct dnod *pre;   //后结点指针
}dnod, *LinkList;
//链表创建函数
void CreatLinkList(LinkList &L)  // 创建链表
{
LinkList p,s;
int x, cycle = 1;
p = (LinkList)malloc(sizeof(dnod)); //申请新结点空间
if(p == NULL)             //检验是否申请成功
{
printf("Fail to malloc the head node!\n");
return;
}


p->pre = NULL;
p->next = NULL;
L = p;
while(cycle)
{
printf("please input the data of the node\n");
printf("input 0 to end:");
scanf("%d",&x);  //读取数值
if(x != 0)
{
s = (LinkList)malloc(sizeof(dnod));   //申请新结点
if(s ==NULL)
{
printf("Fail to malloc a new node!\n");
return;
}             //将新结点插入链表
s->data = x;
p->next = s;
s->pre = p;
s->next = NULL;
p = s;
}
else
{
cycle = 0;
}
}
return ;
}
//打印链表数据元素函数
void PrintLinkList(LinkList L)
{                  //打印链表内容
if(L->next == NULL)  //检验链表是否为空
{
printf("The List L is NULL\n");
return ;
}
LinkList p;
p = L->next;
while(p != NULL)
{
printf("%d",p->data);  //输出结点数值
if(p->next ==NULL)
{
break;
}
p = p->next;  //当前结点指针后移
}
printf("\n");
}
//计算链表长度函数
int lengthLinkList(LinkList L)   //计算链表长度
{
int i = 0;
LinkList p;
p = L->next;
while(p !=  NULL)   //当前结点是否为空
{
i++;  //长度加一
if(p->next == NULL)
{
break;
}
p = p->next; //当前结点后移
}
return i;
}
           

测试程序:

# include <stdio.h>
# include <malloc.h>
void main(void)
{
LinkList L;
CreatLinkList(L);  //创建链表
printf("Length of list is : %d\n",LengthLinkList(L));
PrintLinkList(L);
}
           

运行结果:

please input the data of the node
input 0 to end:1
please input the data of the node
input 0 to end:2
please input the data of the node
input 0 to end:3
please input the data of the node
input 0 to end:4
please input the data of the node
input 0 to end:0
Length of list is : 4
1234
           

面试题7:编程实现双链表插入新结点

一个已知链表,根据给定的位置、数据实现一个新结点的插入。

答案:

void InsertNode(LinkList &L,int num, int data)  //插入新结点
{
int i = 1;
LinkList p1,p2;
p1 = L;
p2 = (LinkList)malloc(sizeof(dnod));  //为新结点申请空间
if(p2 ==NULL)            //检验新结点空间是否申请成功
{
printf("Fail to malloc a new node!\n");
return;
}
p2->data = data;
if(num == 0)                   // 在尾部插入新结点
{
while(p1->next != NULL)   //找到尾结点
{
p1 = p1->next;
}
p2->next = p1->next;   //插入新结点
p2->pre->next = p1; 
p2->pre = p1;
p1->next = p2;
}
else    // 在num处插入新结点
{
while(i < num)
{
i++;
if(p1->next == NULL)  //找到num处
{
printf("The num you given is to large!\n");
return;
}
p1 = p1->next;
}
p2->next = p1->next;
p2->pre->next = p1;   //插入新结点
p2->pre = p1;
p1->next = p2;
}
return ;
}

           

面试题8: 编程实现双链表删除指定结点

已知一个链表,删除指定位置上的结点

答案:

//双向链表的结点删除函数
void DeleteNode(LinkList &L,int num)
{                              //双链表删除结点函数
if(L->next == NULL)  //检验链表是否为空
{
printf("The List is NULL!\n");
return;
}
int i = 1;
LinkList = p1,p2;
p1 = L;
if(num == 0)  //删除尾结点
{
while(p1->next->next != NULL)  // 找到尾结点
{
p1 = p1->next;
}
p2 = p1->next;  //删除结点
p1->next = p2->next;
p2->next->pre = p1;
free(p2);
p2 = NULL;
}
else             //删除第num号结点
{
while(i < num)   //找到第num号结点
{
i++;
if(p1->next == NULL)
{
printf("The num you given is to large!\n");
return;
}
p1 = p1->next;
}
p2 = p1->next; //删除结点
if(p2->next != NULL)
{
p2->next->pre = p1;
}
p1->next = p2->next;
p2->next->pre = p1;
free(p2);
p2 = NULL;
}
return;
}
           

面试题9:简述队列和栈的异同

栈和队列是两种不同的数据结构,它们之间相互联系又相互区别,请简述两者的异同。

答案:队列和栈都是线性存储结构,但是两者的插入和删除数据的操作不同,队列是“先进先出”,栈是“先进后出”。

面试题10:建立一个链式栈。

建立一个链式栈,实现入栈和出栈功能。

答案:

//栈的结点指针结构体
typedef struct node
{
int data;
node *next;
}node, *LinkStack;
//建立空栈的函数
LinkStack CreateNULLStack(LinkStack &S)
{
S = (LinkStack)malloc(sizeof(node)); //申请新结点
if(NULL == S)
{
printf("Fail to malloc a new node.\n");
return NULL;
}
S->data = 0;
S->next = NULL;  //初始化新结点


return S;
}
//栈结点的插入函数
LinkStack Push(LinkStack &S,int data)
{
if(NULL == S)  //判断是否为有效栈
{
printf("There no node in stack!");
return NULL;
}


LinkStack p = NULL;
p = (LinkStack)malloc(sizeof(node));  //申请新结点
if(NULL == p)
{
printf("Fail to malloc a new node.\n");
return S;
}
if(NULL == S->next)  //将新结点压入栈
{
p->next = NULL;
}
else
{
p->next = S->next;
}
p->data = data;  //初始化新结点
S->next = p;


return S;
}
//栈结点的删除函数
node Pop(LinkStack &S)
{
node temp;
temp.data = 0;
temp.next = MULL;


if(NULL == S)   //检验是否为空栈
{
printf("There  no node in stack!");
return temp;
}
temp = *S;
if(S->next == NULL)
{
printf("The stack is NULL,can't pop!");
return temp;
}


LinkStack p = S->next;  //栈顶指针下移
S->next = S->next->next;
temp = *p;


free(p);   //释放原栈顶结点
p = NULL;


return temp;
}
           

面试题11:建立一个链式队列

建立一个链式队列,实现入队和出队功能。

答案:

//结点结构体
typedef struct node
{
int data;
node *next;
}node,*LinkQueue;
//队列结构体
typedef struct Queue
{
LinkQueue head;
LinkQueue tail;
int size;
}Queue, *pQueue;
//创建一个空队列函数
pQueue CreateNULLQueue(pQueue &Q)
{
Q =(pQueue)malloc(sizeof(Queue));  //申请一个队列
if(NULL == Q->head)
{
printf("Fail to malloc the head of Queue!\n");
return NULL;
}
Q->head = (LinkQueue)malloc(sizeof(node)); //申请队首节点
if(NULL == Q->head)
{
printf("Fail to malloc the head of Queue!\n");
return NULL;
}
Q->tail = (LinkQueue)malloc(sizeof(node));  //申请队尾结点
if(NULL == Q->tail)
{
printf("Fail to malloc the head of Queue!\n");
return NULL;
}


Q->head->next = Q->tail;  //初始化队列
Q->tail->next = NULL;
Q->head->data = 0;
Q->tail->data = 0;
Q->size = 0;
return Q;
}
//队列插入函数
pQueue Push(pQueue &Q,int data)
{
if(NULL == Q)  //检验队列
{
printf("There isn't a queue to push!\n");
return NULL;
}
LinkQueue p = NULL;
p = (LinkQueue)malloc(sizeof(node)); // 申请新结点
if(NULL == p)
{
printf("Fail to malloc a new node to push!\n");
return Q;
}
p->data = data;  //插入新结点
p->next = Q->head->next;
Q->head->next = p;
Q->size++;
return Q;
}
//队列删除函数
node Pop(pQueue &Q)
{
node temp, *p, *p1;
temp.data = 0;
temp.next = NULL;
if(NULL == Q)  //检验队列
{
printf("There isn't a queue to pop!\n");
return temp;
}
if(Q->head->next == Q->tail) //检验队列是否为空
{
printf("There isn't a node to pop!\n");
return temp;
}
p = Q->head;
while(Q->tail != p->next->next) //找到队尾结点的上上个结点
{
p = p->next;
}
p1 = p->next;
p->next = Q->tail; //删除队尾结点的上个结点


temp = *p1;
free(p1);
p1 = p = NULL;


Q->size--;
return temp;
}
           

测试函数:

# include <stdio.h>
# include <malloc.h>
void main(void)
{
pQueue Q = NULL;
node temp;
CreateNULLQueue(Q);  //创建空队列


for (int i = 0; i < 8; i++) //入队
{
Push(Q,i);
printf("push %d ",i);
printf("size of queue is :%d\n",Q->size);
}
printf("\n");
while(Q->head->next != Q->tail) //出队
{
temp = Pop(Q);
printf("pop: %d ",temp.data);
printf("size of queue is :%d\n",Q->size);
}
printf("\n");
}
           

运行结果:

push 0 size of queue is :1
push 1 size of queue is :2
push 2 size of queue is :3
push 3 size of queue is :4
push 4 size of queue is :5
push 5 size of queue is :6
push 6 size of queue is :7
push 7 size of queue is :8


pop: 0 size of queue is :7
pop: 1 size of queue is :6
pop: 2 size of queue is :5
pop: 3 size of queue is :4
pop: 4 size of queue is :3
pop: 5 size of queue is :2
pop: 6 size of queue is :1
pop: 7 size of queue is :0
           

面试题12:能否用两个栈实现一个队列的功能?

//节点结构体
typedef struct node
{
int data;
node *next;
}node, *LinkStack;
//创建空栈
LinkStack CreateNULLStack(LinkStack &S)
{
S = (LinkStack)malloc(sizeof(node)); //申请新结点
if(NULL ==S)
{
printf("Fail to malloc a new node.\n");
return NULL;
}


S->data = 0; //初始化新结点
S->next = NULL;


return S;
}
//栈的插入函数
LinkStack Push(LinkStack &S, int data)
{
if(NULL == S)  // 检验栈
{
printf("There no node in stack!");
return NULL;
}


LinkStack p = NULL;
p = (LinkStack)malloc(sizeof(node));  //申请新结点
if(NULL == p)
{
printf("Fail to malloc a new node.\n");
return S;
}
if(NULL == S->next)
{
p->next = NULL;
}
else
{
p->next = S->next;
}
p->data = data;  //初始化新结点
S->next = p;     //插入新结点
return S;
}
//出栈函数
node Pop(LinkStack &S)
{
node temp;
temp.data = 0;
temp.next = NULL;


if(NULL == S)  //检验栈
{
printf("There no node in stack!");
return temp;
}
temp = *S;
if(S->next == NULL)
{
printf("The stack is NULL,can't pop!");
return temp;
}


LinkStack p = S->next;  //结点出栈
S->next = S->next->next;
temp = *p;


free(p);
p = NULL;


return temp;
}
//双栈实现队列的入队函数:
LinkStack StackToQueuePush(LinkStack &S, int data)
{
node n;
LinkStack S1 = NULL;
CreateNULLStack(S1);  //创建空栈


while(NULL != S->next) //S出栈入S1
{
n = Pop(S);
Push(S1,n.data);
}
Push(S1,data);  //新结点入栈


while(NULL != S1->next)   //S1出栈入S
{
n = Pop(S1);
Push(S,n.data);
}


return S;
}
           

测试函数:

#include <stdio.h>
#include <malloc.h>
void main(void)
{
node n;
LinkStack S1 = NULL;
CreateNULLStack(S1);  //创建空栈


for(int i=0; i<8; i++)  //入队列式栈
{
StackToQueuePush(S1,i);
printf("%d ",i);
}
printf("\n");


while(NULL != S1->next)  //出队列式栈
{
n = Pop(S1);
printf("%d ",n.data);
}
printf("\n");
}

           

运行结果:

0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
           

面试题13:建立一个二叉树

编码实现二叉树的创建,二叉树的先序、中序和后序遍历。

答案:

typedef struct BiTNode  //定义二叉树节点结构
{
char data;  //数据域
struct BiTNode *lchild;//左子指针域
struct BiTNode *rchild;//右子指针域
}BiTNode, *BiTree;


BiTree CreatT(BiTree &b)
{
char ch;
ch = getchar();  //读取数值
if(ch == '#')  //判断是否为结束符
{
b = NULL;
}
else
{
b = (BiTree)malloc(sizeof(BiTNode));  //申请新结点
if(NULL == b)
{
printf("overflow err\n");
return NULL;
}
b->data = ch;  //初始化新结点
CreatT(b->lchild); //插入当前结点的左指针
CreatT(b->rchild); //插入当前结点的右指针
}
return b;
}


void PreOrder(BiTree T)
{
if(T)
{
printf("%c ",T->data);  //访问结点
PreOrder(T->lchild);    //遍历左子树
PreOrder(T->rchild);    //遍历右子树
}
}


void InOrder(BiTree T)
{
if(T)
{
InOrder(T->lchild); // 遍历左子树
printf("%c ",T->data); //访问结点
InOrder(T->rchild);  //遍历右子树
}
}


void PostOrder(BiTree T)
{
if(T)
{
PostOrder(T->lchild);  //遍历左子树
PostOrder(T->rchild);  //遍历右子树
printf("%c ",T->data); //访问结点
}
}
           

测试程序:

#include <stdio.h>
#include <malloc.h>

void main()
{
BiTree T;
int flag = 1;
printf("建树将以三个#后回车结束。\n");
printf("例如:1#2#3#4#5#6### \n");
CreatT(T);   //初始化队列

printf("递归先序遍历二叉树:"); //先序遍历
PreOrder(T);
printf("\n");

printf("递归中序遍历二叉树:"); //中序遍历
InOrder(T);
printf("\n");

printf("递归后序遍历二叉树:"); //后序遍历
PostOrder(T);
printf("\n");
}
           

运行结果:

建树将以三个#后回车结束。

例如:1#2#3#4#5#6###

1#2#3#4#5#6###

递归先序遍历二叉树:1 2 3 4 5 6

递归中序遍历二叉树:1 2 3 4 5 6

递归后序遍历二叉树:6 5 4 3 2 1

面试题14;计算一棵二叉树的深度

设计一个算法,实现计算二叉树的深度的功能。

答案:

int depth(BiTree T)
{
if(!T) return 0; //判断当前结点是否为叶子结点
int d1 = depth(T->lchild); //求当前结点的左子树的深度
int d2 = depth(T->rchild); //求当前结点的右子树的深度
return (d1 > d2 ? d1:d2)+1;
}
           

测试程序:

#include <stdio.h>
#include <malloc.h>
typedef struct BiTNode  //定义二叉树节点结构
{
char data;  //数据域
struct BiTNode *lchild;//左子指针域
struct BiTNode *rchild;//右子指针域
}BiTNode, *BiTree;


BiTree CreatT(BiTree &b)
{
char ch;
ch = getchar();  //读取数值
if(ch == '#')  //判断是否为结束符
{
b = NULL;
}
else
{
b = (BiTree)malloc(sizeof(BiTNode));  //申请新结点
if(NULL == b)
{
printf("overflow err\n");
return NULL;
}
b->data = ch;  //初始化新结点
CreatT(b->lchild); //插入当前结点的左指针
CreatT(b->rchild); //插入当前结点的右指针
}
return b;
}


void PreOrder(BiTree T)
{
if(T)
{
printf("%c ",T->data);  //访问结点
PreOrder(T->lchild);    //遍历左子树
PreOrder(T->rchild);    //遍历右子树
}
}


void InOrder(BiTree T)
{
if(T)
{
InOrder(T->lchild); // 遍历左子树
printf("%c ",T->data); //访问结点
InOrder(T->rchild);  //遍历右子树
}
}


void PostOrder(BiTree T)
{
if(T)
{
PostOrder(T->lchild);  //遍历左子树
PostOrder(T->rchild);  //遍历右子树
printf("%c ",T->data); //访问结点
}
}


int depth(BiTree T)
{
if(!T) return 0; //判断当前结点是否为叶子结点
int d1 = depth(T->lchild); //求当前结点的左子树的深度
int d2 = depth(T->rchild); //求当前结点的右子树的深度
return (d1 > d2 ? d1:d2)+1;
}
void main()
{
BiTree T;
int flag = 1, n;
printf("建树将以三个#后回车结束。\n");
printf("例如:1#2#3#4#5#6### \n");
CreatT(T);   //初始化队列


printf("递归先序遍历二叉树:"); //先序遍历
PreOrder(T);
printf("\n");


printf("递归中序遍历二叉树:"); //中序遍历
InOrder(T);
printf("\n");


printf("递归后序遍历二叉树:"); //后序遍历
PostOrder(T);
printf("\n");
n = depth(T);
printf("n: %d\n",n);
}

           

面试题15:在二叉树中找出和为某一值的所有路径

输入一个整数和一棵二元树。从树的根节点开始往下访问,一直到叶节点所经过的所有结点形成一条路径。打印

出和与输入整数相等的所有路径。例如输入整数9和如下二元树:

               3

             /   \

           2       6

          /  \

         5    4

则打印出两条路径:3,6和3,2,4。

答案:

typedef struct path
{
BiTNode* tree;  //节点数据成员
struct path* next;  //结点指针成员
}PATH, *pPath;
 // 初始化树的结点栈:
void init_path(pPath* L)
{
*L = (pPath)malloc(sizeof(PATH)); //创建空树
(*L)->next = NULL;
}


//树结点入栈函数:
void push_path(pPath H, pBTree T)
{
pPath p = H->next;
pPath q = H;


while (NULL != p)
{
q = p;
p = p->next;
}


p = (pPath)malloc(sizeof(PATH));  //申请新结点
p->next = NULL;   //初始化新结点
p->tree = T;


q->next = p;  //新结点入栈
}
//树结点打印函数:
void print_path(pPath L)
{
pPath p = L->next;


while(NULL != p)  //打印当前栈中所有数据
{
printf("%d, ",p->tree->data);
p = p->next;
}
}
//树结点出栈函数:
void pop_path(pPath H)
{
pPath p = H->next;
pPath q = H;
if(NULL == p) //检验当前栈是否为空
{
printf("Stack is null!\n");
return;
}
p = p->next;
while(NULL != p)  //出栈
{
q = q->next;
p = p->next;
}
free(q->next); //释放出栈结点空间
q->next = NULL;
}
//判断结点是否为叶子结点:
int IsLeaf(pBTree T)
{
return (T->lchild == NULL) && (T->rchild == NULL);
}
//查找符合条件的路径:


int find_path(pBTree T, int sum, pPath L)
{
push_path(L,T);
record += T->data;


if((record == sum) && (IsLeaf(T))) //打印符合条件的当前路径
{
print_path(L);
printf("\n");
}


if(T->lchild != NULL)  //递归查找当前结点的左子树
{
find_path(T->lchild,sum,L);
}
if(T->rchild != NULL)  //递归查找当前结点的右子树
{
find_path(T->rchild,sum,L);
}


record -= T->data;
pop_path(L);
return 0;
}
           

继续阅读