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

相关推荐
程序员东岸2 小时前
《数据结构——排序(中)》选择与交换的艺术:从直接选择到堆排序的性能跃迁
数据结构·笔记·算法·leetcode·排序算法
牢七3 小时前
数据结构11111
数据结构
Ayanami_Reii3 小时前
进阶数据结构应用-一个简单的整数问题2(线段树解法)
数据结构·算法·线段树·延迟标记
CoderYanger6 小时前
C.滑动窗口-越短越合法/求最长/最大——2958. 最多 K 个重复元素的最长子数组
java·数据结构·算法·leetcode·哈希算法·1024程序员节
不会c嘎嘎7 小时前
【数据结构】AVL树详解:从原理到C++实现
数据结构·c++
却话巴山夜雨时i7 小时前
394. 字符串解码【中等】
java·数据结构·算法·leetcode
惊鸿.Jh7 小时前
503. 下一个更大元素 II
数据结构·算法·leetcode
客梦7 小时前
数据结构-栈与队列
数据结构·笔记
TL滕8 小时前
从0开始学算法——第四天(题目参考答案)
数据结构·笔记·python·学习·算法