面试题答案
一键面试1. 树形结构构建与遍历实现
#include <stdio.h>
#include <stdlib.h>
// 定义结构体
typedef struct TreeNode {
int data; // 节点数据,以整型为例,可替换为实际属性
struct TreeNode **children; // 指针数组指向孩子节点
int childCount; // 孩子节点数量
} TreeNode;
// 创建新节点
TreeNode* createNode(int data) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->data = data;
newNode->children = NULL;
newNode->childCount = 0;
return newNode;
}
// 添加孩子节点
void addChild(TreeNode* parent, TreeNode* child) {
parent->children = (TreeNode**)realloc(parent->children, (parent->childCount + 1) * sizeof(TreeNode*));
parent->children[parent->childCount++] = child;
}
// 深度优先搜索遍历
void DFS(TreeNode* root) {
if (root == NULL) return;
// 打印节点属性,这里以打印数据为例
printf("%d ", root->data);
for (int i = 0; i < root->childCount; i++) {
DFS(root->children[i]);
}
}
// 释放内存
void freeTree(TreeNode* root) {
if (root == NULL) return;
for (int i = 0; i < root->childCount; i++) {
freeTree(root->children[i]);
}
free(root->children);
free(root);
}
2. 如何利用指针数组实现树形结构的构建与遍历
- 构建:通过
createNode
函数创建单个节点,使用addChild
函数为父节点动态分配内存并添加孩子节点指针到指针数组children
中,同时更新childCount
记录孩子节点数量。 - 遍历:在
DFS
函数中,首先访问当前节点(这里进行打印操作),然后通过循环遍历指针数组children
,递归调用DFS
对每个孩子节点进行深度优先搜索。
3. 时间复杂度分析
假设树中节点数为 n
,每个节点访问一次,并且每个节点对其孩子节点的遍历操作与孩子节点数量相关。因为每个节点访问和对其孩子节点的操作次数线性相关,所以时间复杂度为 O(n)。
4. 空间复杂度分析
- 最坏情况下,递归调用栈的深度等于树的高度。对于一般的树,高度最大为
n
(即树退化为链表的情况),所以空间复杂度为 O(n)。 - 如果树是平衡树,高度为 log(n),空间复杂度为 O(log(n))。这里按最坏情况考虑,空间复杂度为 O(n),主要由递归调用栈占用的空间决定。
5. 测试代码
int main() {
TreeNode* root = createNode(1);
TreeNode* node2 = createNode(2);
TreeNode* node3 = createNode(3);
TreeNode* node4 = createNode(4);
TreeNode* node5 = createNode(5);
addChild(root, node2);
addChild(root, node3);
addChild(node2, node4);
addChild(node2, node5);
printf("深度优先搜索遍历结果: ");
DFS(root);
printf("\n");
freeTree(root);
return 0;
}