【数据结构】二叉树OJ

目录

1.LeetCode965.单值二叉树

[965. 单值二叉树 - 力扣(LeetCode)](#965. 单值二叉树 - 力扣(LeetCode))

解题思路:

C语音代码

2.LeetCode100.相同的树

[100. 相同的树 - 力扣(LeetCode)](#100. 相同的树 - 力扣(LeetCode))

解题思路

C语言代码

3.LeetCode101.对称二叉树

[101. 对称二叉树 - 力扣(LeetCode)](#101. 对称二叉树 - 力扣(LeetCode))

解题思路

C语言代码

4.LeetCode144.二叉树的前序遍历

[144. 二叉树的前序遍历 - 力扣(LeetCode)](#144. 二叉树的前序遍历 - 力扣(LeetCode))

解题思路

C语言代码

5.LeetCode94.二叉树的中序遍历

[94. 二叉树的中序遍历 - 力扣(LeetCode)](#94. 二叉树的中序遍历 - 力扣(LeetCode))

C语言代码

6.LeetCode145.二叉树的后序遍历

[145. 二叉树的后序遍历 - 力扣(LeetCode)](#145. 二叉树的后序遍历 - 力扣(LeetCode))

C语言代码

7.LeetCode572.另一棵树的子树

[572. 另一棵树的子树 - 力扣(LeetCode)](#572. 另一棵树的子树 - 力扣(LeetCode))

解题思路

C语言代码

[8.牛客TSINGK110 二叉树遍历](#8.牛客TSINGK110 二叉树遍历)

二叉树遍历_牛客题霸_牛客网

C语言代码


1.LeetCode965.单值二叉树

965. 单值二叉树 - 力扣(LeetCode)

解题思路:

将二叉树分为根节点和左右子树,递归判断二叉树中所有子树的结点是否相等,如果不同则返回false,判断完全部结点说明全部结点的值都相等,返回true

C语音代码

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool isUnivalTree(struct TreeNode* root) {
    if(root == NULL){
        return true;
    }
    if((root->left && root->left->val != root->val)||(root -> right && root->right->val != root->val)){
        return false;
    }

    return isUnivalTree(root->left)&&isUnivalTree(root->right);
}

2.LeetCode100.相同的树

100. 相同的树 - 力扣(LeetCode)

解题思路

当两棵树的根节点都为空时,两棵树一定相同,返回true;

当两棵树中有一棵为空另一棵不为空时,两棵树一定不相同,返回false;

当两棵树都不为空时,依次比较根节点和左右子树是否相同。

C语言代码

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
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);
}

3.LeetCode101.对称二叉树

101. 对称二叉树 - 力扣(LeetCode)

解题思路

一棵树是否对称与根节点无关,所以可以忽略根节点,判断根节点的左右子树是否是对称的即可。

本题代码与100相同的树非常相似,只是在递归调用时参数由p的左子树和q的左子树、p的右子树和q的右子树比较变为p的左子树和q的右子树、q的右子树和q的左子树比较。

C语言代码

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

bool _isSymmetric(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 _isSymmetric(p->left,q->right) && _isSymmetric(p->right,q->left);
}

bool isSymmetric(struct TreeNode* root) {
    return _isSymmetric(root->left,root->right);
}

4.LeetCode144.二叉树的前序遍历

144. 二叉树的前序遍历 - 力扣(LeetCode)

解题思路

题目要求返回前序遍历的数组,所以遍历二叉树时进行的操作就是将数据存入数组。

C语言代码

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

int treeSize(struct TreeNode* root){
    if(root == NULL){
        return 0;
    }
    return treeSize(root->left) + treeSize(root->right) + 1;
}

void preOrder(struct TreeNode* root,int* a,int* pi){
    if(root == NULL){
        return;
    }

    a[(*pi)++] = root->val;
    preOrder(root->left,a,pi);
    preOrder(root->right,a,pi);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = treeSize(root);
    int* a = (int*)malloc(sizeof(int)*(*returnSize));
    int i = 0;

    preOrder(root,a,&i);
    return a;
}

5.LeetCode94.二叉树的中序遍历

94. 二叉树的中序遍历 - 力扣(LeetCode)

C语言代码

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

int treeSize(struct TreeNode* root){
    if(root == NULL){
        return 0;
    }

    return treeSize(root->left)+treeSize(root->right)+1;
}

void InOrder(struct TreeNode* root,int* a,int* pi){
    if(root == NULL){
        return;
    }
    InOrder(root->left,a,pi);
    a[(*pi)++] = root->val;
    InOrder(root->right,a,pi);
}

int* inorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = treeSize(root);
    int* a = (int*)malloc(sizeof(int)*(*returnSize));
    int i = 0;

    InOrder(root,a,&i);
    return a;
}

6.LeetCode145.二叉树的后序遍历

145. 二叉树的后序遍历 - 力扣(LeetCode)

C语言代码

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int treeSize(struct TreeNode* root){
    if(root == NULL){
        return 0;
    }

    return treeSize(root->left)+treeSize(root->right)+1;
}

void postOrder(struct TreeNode* root,int* a,int* pi){
    if(root == NULL){
        return;
    }

    postOrder(root->left,a,pi);
    postOrder(root->right,a,pi);
    a[(*pi)++] = root->val;
}

int* postorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = treeSize(root);
    int* a = (int*)malloc(sizeof(int)*(*returnSize));
    int i = 0;

    postOrder(root,a,&i);
    return a;
}

7.LeetCode572.另一棵树的子树

572. 另一棵树的子树 - 力扣(LeetCode)

解题思路

判断子树的根节点和另一颗树的结点是否相同,如果相同则以相同的结点为根节点判断两棵子树是否相同。

C语言代码

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

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(root->val == subRoot->val && isSameTree(root,subRoot)){
        return true;
    }
    return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}

8.牛客TSINGK110 二叉树遍历

二叉树遍历_牛客题霸_牛客网

C语言代码

cpp 复制代码
#include <stdio.h>

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

BinTree* CreateTree(char* a, int* pi){
    if(a[*pi] == '#'){
        (*pi)++;
        return NULL;
    }

    BinTree* root = (BinTree*)malloc(sizeof(BinTree));
    root->val = a[(*pi)++];
    root->left = CreateTree(a, pi);
    root->right = CreateTree(a, pi);
    return root;
}

void InOrder(BinTree* root){
    if(root == NULL){
        return;
    }

    InOrder(root->left);
    printf("%c ",root->val);
    InOrder(root->right);
}

int main() {
    char a[100];
    scanf("%s",a);
    int i = 0;
    BinTree* root = CreateTree(a, &i);
    InOrder(root);
    return 0;
}

相关推荐
CSharp精选营15 小时前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假4 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠5 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦12 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠13 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾13 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82113 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q13 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒13 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记13 天前
单项不带头不循环链表
数据结构·链表