关于二叉树的OJ练习
关于二叉树的OJ练习
本文章将展示zach在学习二叉树时所做的OJ练习
- 单值二叉树
typedef struct TreeNode tree_node;
bool isUnivalTree(struct TreeNode* root) {if (root == NULL)return true;if (root->left && root->left->val != root->val)return false;if (root->right && root->right->val != root->val)return false;return isUnivalTree(root->left) && isUnivalTree(root->right);
}
- 相同的树
typedef struct TreeNode tree_node;
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 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->right) && isSameTree(p->right, q->left);
}bool isSymmetric(struct TreeNode* root) {return isSameTree(root->left, root->right);
}
- 另一颗树的子树
typedef struct TreeNode tree_node;
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);
}
- 二叉树的前序遍历
typedef struct TreeNode tree_node;int tree_size(tree_node* root)
{if (root == NULL)return 0;return 1 + tree_size(root->left) + tree_size(root->right);
}
void _preorderTraversal(tree_node* root, int* arr, int* pi)
{if (root == NULL)return;arr[(*pi)++] = root->val;_preorderTraversal(root->left, arr, pi);_preorderTraversal(root->right, arr, pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {*returnSize = tree_size(root);int* arr = (int*)malloc(sizeof(int) * (*returnSize));int i = 0;_preorderTraversal(root, arr, &i);return arr;
}
- 二叉树的中序遍历
typedef struct TreeNode tree_node;
int tree_size(tree_node* root) {if (root == NULL)return 0;return 1 + tree_size(root->left) + tree_size(root->right);
}void _inorderTraversal(tree_node* root, int* arr, int* pi) {if (root == NULL)return;if (root->left != NULL) {_inorderTraversal(root->left, arr, pi);}arr[(*pi)++] = root->val;_inorderTraversal(root->right, arr, pi);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize) {*returnSize = tree_size(root);int* arr = (int*)malloc(sizeof(int) * (*returnSize));int i = 0;_inorderTraversal(root, arr, &i);return arr;
}
- 二叉树的后序遍历
typedef struct TreeNode tree_node;int tree_size(tree_node* root) {if (root == NULL)return 0;return 1 + tree_size(root->left) + tree_size(root->right);
}
void _postorderTraversal(tree_node* root, int* arr, int* pi) {if (root == NULL)return;if (root->left != NULL)_postorderTraversal(root->left, arr, pi);_postorderTraversal(root->right, arr, pi);arr[(*pi)++] = root->val;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize) {*returnSize = tree_size(root);int* arr = (int*)malloc(*returnSize * sizeof(int));int i = 0;_postorderTraversal(root, arr, &i);return arr;
}
- 二叉树的遍历
#include <stdio.h>
#include <stdlib.h>typedef struct binary_tree_node {char data;struct binary_tree_node* left;struct binary_tree_node* right;
} btnode;// 根据数组创建二叉树
btnode* buy_node(char x) {btnode* new_node = (btnode*)malloc(sizeof(btnode));new_node->data = x;new_node->left = new_node->right = NULL;return new_node;
}
btnode* creat_tree(char* arr, int* pi) {if (arr[*pi] == '#') {(*pi)++;return NULL;}btnode* root = buy_node(arr[(*pi)++]);root->left = creat_tree(arr, pi);root->right = creat_tree(arr, pi);return root;
}void inorder(btnode* root) {if (root == NULL)return;inorder(root->left);printf("%c ", root->data);inorder(root->right);
}int main() {char arr[100];scanf("%s", arr);int i = 0;btnode* root = creat_tree(arr, &i);inorder(root);return 0;
}
完