二叉树的经典例题(干货满满附源码)

判断是否为完全二叉树

 二叉树判断是否为完全二叉树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);
}

对称二叉树

此题的代码和上述证明相同树,源码重合性较高所以不进行源码的拷贝。

oj题证明对称二叉树

另一棵树的子树

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

oj题证明另一棵树的子树

二叉树的遍历

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

思路解析

二叉树遍历的源码:

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;
}

总结

上述例题均是利用了递归进行二叉树问题的解决,虽然思路不是很难但是自己上手还是有一点问题,值的我们自己进行上手练习一下。最后整理不易希望各位大佬能一键三连(收藏,点赞,关注)。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值