目录
[965. 单值二叉树 - 力扣(LeetCode)](#965. 单值二叉树 - 力扣(LeetCode))
[100. 相同的树 - 力扣(LeetCode)](#100. 相同的树 - 力扣(LeetCode))
[101. 对称二叉树 - 力扣(LeetCode)](#101. 对称二叉树 - 力扣(LeetCode))
[144. 二叉树的前序遍历 - 力扣(LeetCode)](#144. 二叉树的前序遍历 - 力扣(LeetCode))
[94. 二叉树的中序遍历 - 力扣(LeetCode)](#94. 二叉树的中序遍历 - 力扣(LeetCode))
[145. 二叉树的后序遍历 - 力扣(LeetCode)](#145. 二叉树的后序遍历 - 力扣(LeetCode))
[572. 另一棵树的子树 - 力扣(LeetCode)](#572. 另一棵树的子树 - 力扣(LeetCode))
[8.牛客TSINGK110 二叉树遍历](#8.牛客TSINGK110 二叉树遍历)
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;
}
完