嵌入式大厂面经 二叉树常见面试题(持续更新中!)
这是一个嵌入式大厂面试题专栏,每天更新高频面试题。专栏将包含题目描述、详细解析、相关知识点扩展以及实际代码示例。内容涵盖操作系统、驱动开发、通信协议等核心领域,并结合实际项目经验进行分析。每道题目都会附带面试官可能的追问方向,帮助大家更好地准备面试!
一、基础概念
1. 二叉树的基本定义与实现
// 二叉树节点结构定义 typedef struct TreeNode { int data; // 节点数据 struct TreeNode *left; // 左子节点指针 struct TreeNode *right; // 右子节点指针 } TreeNode; // 创建新节点 TreeNode* createNode(int value) { TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode)); if(newNode == NULL) { // 内存分配失败处理 return NULL; } newNode->data = value; newNode->left = NULL; newNode->right = NULL; return newNode; }
2. 二叉树的特殊类型
- 完全二叉树:除最后一层外,其他层节点数达到最大,且最后一层节点从左到右填充
- 满二叉树:所有层的节点数都达到最大
- 二叉搜索树:左子树所有节点值小于根节点,右子树所有节点值大于根节点
- 平衡二叉树:任意节点的左右子树高度差不超过1
二、遍历算法
1. 深度优先遍历(DFS)
前序遍历(根-左-右)
void preorderTraversal(TreeNode* root) { if(root == NULL) return; printf("%d ", root->data); // 访问根节点 preorderTraversal(root->left); // 遍历左子树 preorderTraversal(root->right); // 遍历右子树 }
中序遍历(左-根-右)
void inorderTraversal(TreeNode* root) { if(root == NULL) return; inorderTraversal(root->left); // 遍历左子树 printf("%d ", root->data); // 访问根节点 inorderTraversal(root->right); // 遍历右子树 }
后序遍历(左-右-根)
void postorderTraversal(TreeNode* root) { if(root == NULL) return; postorderTraversal(root->left); // 遍历左子树 postorderTraversal(root->right); // 遍历右子树 printf("%d ", root->data); // 访问根节点 }
2. 非递归实现(栈实现)
前序遍历非递归实现
void preorderIterative(TreeNode* root) { if(root == NULL) return; // 创建栈 TreeNode* stack[100]; // 假设最多100个节点 int top = -1; // 根节点入栈 stack[++top] = root; while(top >= 0) { // 出栈并访问 TreeNode* node = stack[top--]; printf("%d ", node->data); // 先右后左入栈(出栈时会先处理左节点) if(node->right) stack[++top] = node->right; if(node->left) stack[++top] = node->left; } }
3. 层序遍历(BFS)
void levelOrderTraversal(TreeNode* root) { if(root == NULL) return; // 创建队列 TreeNode* queue[100]; // 假设最多100个节点 int front = 0, rear = 0; // 根节点入队 queue[rear++] = root; while(front < rear) { // 出队并访问 TreeNode* node = queue[front++]; printf("%d ", node->data); // 左右子节点入队 if(node->left) queue[rear++] = node->left; if(node->right) queue[rear++] = node->right; } }
三、常见操作与算法
1. 计算二叉树高度
int getHeight(TreeNode* root) { if(root == NULL) return 0; int leftHeight = getHeight(root->left); int rightHeight = getHeight(root->right); return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1; }
2. 判断是否为平衡二叉树
int isBalanced(TreeNode* root) { if(root == NULL) return 1; // 空树是平衡的
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
嵌入式面试八股文全集 文章被收录于专栏
这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。