使用一个长度为N的数组,1<=N<=50,存储一棵完全二叉树。(二叉树中每个节点最多有两个子树称为左子树和右子树。完全二叉树是除最后一层外,每一层上的节点数均达到最大值;在最后一层上只缺少右边的若干节点。在数组中,如果以下标1为起始位置,那么每个节点的左儿子是其自己下标乘以2的节点,右儿子是自己下标乘以2加1的节点,即arr[i*2]和arr[i*2+1]是arr[i]的左右儿子。)然后使用左子树优先的深度优先搜索方法搜索一棵完全二叉树中的一个值为X的节点,最终输出其深度优先搜索的过程,如果一棵树中存在值相同的节点,以第一个被搜索到的为准然后结束。
本题目已给出main函数,需要以递归方式在头文件DFS.h中实现DFS函数,函数没有返回值,整个搜索过程的输出均在DFS函数中实现,函数有4个参数分别是:1、数组arr,2、数组长度N,3、下标位置pos,4、要被搜索的数字X。
输入:3行输入;第1行输入为长度N;第二行输入N个数字以空格间隔;第三行输入要搜索的数字X。
输出:深度搜索的过程,每个数字以空格间隔,最后一个数字后没有空格,以换行符“\n”结束。
Sample:
input:
20
16 73 22 56 86 84 37 50 83 60 18 18 48 44 70 77 52 72 23 95
18
output:
16 73 56 50 77 52 83 72 23 86 60 95 18
此题不需要建立二叉树,只是一种类似完全二叉树的思想,把每个数组之间构成一个虚拟的链接再进行遍历搜索。
#include<stdio.h>
#include<stdlib.h>
#define max 50
int flag = 0;
//结束递归要用全局变量才能一次把所有递归都结束了,只能return只能结束一次递归。
void DFS(int arr[], int leng, int pos, int x) {
if (arr[pos] == x && !flag) {
flag = 1;
printf("%d\n", arr[pos]);
}
if (!flag){
printf("%d ", arr[pos]);
if ((pos + 1) * 2 - 1 >= leng) {
return;
}
DFS(arr, leng, (pos + 1) * 2 - 1, x);
if ((pos + 1) * 2 >= leng) {
return;
}
DFS(arr, leng, (pos + 1) * 2, x);
}
}
int main() {
int leng = 0;
int arr[max] = {0};
int i;
int X = 0;
scanf("%d", &leng);
for (i = 0; i < leng; i++) {
scanf("%d", &arr[i]);
}
scanf("%d", &X);
DFS(arr, leng, 0, X);
return 0;
}