【数据结构】二叉树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;
}

相关推荐
多米Domi01114 小时前
0x3f第33天复习 (16;45-18:00)
数据结构·python·算法·leetcode·链表
曹仙逸15 小时前
数据结构day04
数据结构
Lips61115 小时前
2026.1.16力扣刷题
数据结构·算法·leetcode
曹仙逸15 小时前
数据结构day05
数据结构
睡一觉就好了。16 小时前
树的基本结构
数据结构
kaikaile199516 小时前
A星算法避开障碍物寻找最优路径(MATLAB实现)
数据结构·算法·matlab
今天_也很困16 小时前
LeetCode 热题100-15.三数之和
数据结构·算法·leetcode
思成Codes18 小时前
ACM训练:接雨水3.0——动态接雨水
数据结构·算法
sin_hielo18 小时前
leetcode 2943
数据结构·算法·leetcode
Snow_day.19 小时前
有关平衡树
数据结构·算法·贪心算法·动态规划·图论