判断是否为完全二叉树
二叉树判断是否为完全二叉树oj源码
bool TreeComplete(tree* root)
{
Qu q;
QueueInit(&q);
QueuePush(&q, root);
while (!QueueEmpty(&q))
{
//取队头,打印
tree* front = QueueFront(&q);
QueuePop(&q);
//队头节点的左右孩子入队列
if (front == NULL)
{
break;
}
QueuePush(&q, front->left);
QueuePush(&q, front->right);
}
//虽然遇见null但是队列中还有数据时
while (!QueueEmpty(&q))
{
tree* front = QueueFront(&q);
QueuePop(&q);
//队头节点的左右孩子入队列
if (front != NULL)
{
QueueDestroy(&q);
return false;
}
}
//队列为空
QueueDestroy(&q);
return true;
}
单值二叉树
二叉树oj源码
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);
}
相同的树
此题的解析思路和上题一样通过递归遍历,然后比较两个树的值进行比较,从而解决这个问题。因此这里不做详细的讲解。

相同树的oj源码
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);
}
对称二叉树
此题的代码和上述证明相同树,源码重合性较高所以不进行源码的拷贝。

另一棵树的子树
本题与上面类型题十分相似,主要还是运用了相同树的方法,利用递归实现遍历,进而解决这个问题。本题代码并未涉及较多新的代码,因此不在进行附源码。

二叉树的遍历
此题分为三步第一步计算节点数,利用节点数开辟空间,第三将数据放到数组中去。

二叉树遍历的源码:
typedef struct TreeNode TreeNode;
int TreeSize(TreeNode*root)
{
if(root==NULL)
{
return 0;
}
return 1+TreeSize(root->left)+TreeSize(root->right);
}
void _preorderTraversal(struct TreeNode* 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) {
//1,计算需要有多少个节点
*returnSize=TreeSize(root);
//2创建数组的大小
int *arr=(int*)malloc(sizeof(int)*(*returnSize));
//向数组中插入数据
int i=0;
_preorderTraversal( root, arr,&i);
return arr;
}
二叉树的构建及遍历
本题主要分为三步进行解题:一获取字符,二创建二叉树,三实现二叉树的中序遍历。
二叉树的构建及遍历源码:
#include <stdio.h>
#include<stdlib.h>
typedef struct BinaryTree {
char data;
struct BinaryTree* left;
struct BinaryTree* right;
} tree;
tree* buyNode(char x) {
tree* newnode = (tree*)malloc(sizeof(tree));
newnode->data = x;
newnode->left = newnode->right = NULL;
return newnode;
}
tree* CreatTree(char *arr,int *i)
{
if(arr[*i]=='#')
{
(*i)++;
return NULL;
}
tree*root=buyNode(arr[(*i)++]);
root->left=CreatTree(arr,i);
root->right=CreatTree(arr,i);
return root;
}
void Inorder(tree*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;
tree* root=CreatTree(arr,&i);
//中序遍历
Inorder(root);
return 0;
}
总结
上述例题均是利用了递归进行二叉树问题的解决,虽然思路不是很难但是自己上手还是有一点问题,值的我们自己进行上手练习一下。最后整理不易希望各位大佬能一键三连(收藏,点赞,关注)。