二叉树(LeetCode)

个人主页流年如梦

专栏《零基础轻松入门C语言》 《数据结构:从入门到掌握》

文章目录

一.相同的树

👉点击转跳

原题

参考代码

c 复制代码
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if (p == NULL && q == NULL) return true;
    if (p == NULL || q == NULL) return false;
    if (p->val != q->val) return false;
    return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}

🧐思路 :先判断根节点是否都为空(相同),或其中一个为空(不同),再判断当前节点值是否相等,最后递归判断左右子树是否分别相同

二.对称二叉树

👉点击转跳

原题

参考代码

c 复制代码
bool isMirror(struct TreeNode* left, struct TreeNode* right) {
    if (left == NULL && right == NULL) return true;
    if (left == NULL || right == NULL) return false;
    if (left->val != right->val) return false;
    return isMirror(left->left, right->right) && isMirror(left->right, right->left);
}

bool isSymmetric(struct TreeNode* root) {
    if (root == NULL) return true;
    return isMirror(root->left, root->right);
}

🧐思路

  1. 根节点为空时直接返回true
  2. 定义辅助函数,判断两个节点是否互为镜像:

1)两个节点都为空 --> 镜像

2)一个为空、一个不为空 --> 不镜像

3)节点值不同 --> 不镜像

4)递归判断左节点的左孩子和右节点的右孩子,以及左节点的右孩子和 右节点的左孩子是否互为镜像

三.另一棵树的子树

👉点击转跳

原题


参考代码

c 复制代码
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if (p == NULL && q == NULL) return true;
    if (p == NULL || q == NULL) return false;
    if (p->val != q->val) return false;
    return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {
    if (root == NULL) return false;
    if (isSameTree(root, subRoot)) return true;
    return isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
}

🧐思路 :定义辅助函数isSameTree,判断两棵树是否完全相同;递归遍历root的每个节点,判断以该节点为根的子树是否和subRoot相同

四.二叉树的构建及遍历

👉点击转跳

原题

参考代码

c 复制代码
#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode {
    char val;
    struct TreeNode *left;
    struct TreeNode *right;
} TreeNode;

//构建二叉树(全局指针记录当前读取位置)
TreeNode* buildTree(const char **s) {
    if (**s == '#' || **s == '\0') {
        (*s)++;
        return NULL;
    }
    TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
    node->val = **s;
    (*s)++;
    node->left = buildTree(s);
    node->right = buildTree(s);
    return node;
}
//中序遍历
void inorder(TreeNode* root) {
    if (root == NULL) return;
    inorder(root->left);
    printf("%c ", root->val);
    inorder(root->right);
}
//释放内存
void freeTree(TreeNode* root) {
    if (root == NULL) return;
    freeTree(root->left);
    freeTree(root->right);
    free(root);
}

int main() {
    char s[101];
    while (scanf("%s", s) != EOF) {
        const char *p = s;
        TreeNode* root = buildTree(&p);
        inorder(root);
        printf("\n");
        freeTree(root);
    }
    
    return 0;
}

🧐思路构建二叉树 ,用递归方式读取字符串,遇到#代表空树,否则创建节点并递归构建左右子树;再中序遍历(左根右)

相关推荐
不懒不懒11 分钟前
【针对路面识别数据集,结合三轴加速度标准化数据及多路面识别需求,以下是算法选择与处理方案】
算法
Reart27 分钟前
Leetcode 121. 买卖股票的最佳时机(717)
后端·算法
会编程的小孩35 分钟前
初识数据类型以及变量定义
数据结构·算法
Reart1 小时前
Leetcode 337.打家劫舍3(717)
后端·算法
梅梅绵绵冰1 小时前
数据结构-时间复杂度
数据结构·算法
遥感知识服务1 小时前
盐碱地、白屋顶和裸土都很亮,卫星怎样分清?
人工智能·算法·机器学习
可编程芯片开发1 小时前
基于PID控制器的车辆控制系统simulink建模与仿真
算法
广州灵眸科技有限公司1 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) 系统操作-线进程操作
数据库·单片机·嵌入式硬件·算法·php
-dzk-2 小时前
【哈希】LC 49.字母异位词分组
算法·哈希算法
浩哥学JavaAI2 小时前
2026年最新AI agent面试(06)_RAG文档与检索
人工智能·面试·职场和发展