数据结构-二叉树-链式(二)-OJ

一、二叉树查找值为x的节点

这道题的坑就是我们不知道如何把接收到的返回值返回到最外面。

cpp 复制代码
BTNode* BinaryTreeFind(BTNode* root, BTNodeDataType x)
{
	if (root == NULL)
	{
		return NULL;
	}

	if (root->data == x)
	{
		return root;
	}
	//去找左子树
	BTNode* lefttemp  = BinaryTreeFind(root->left,x);
	if (lefttemp)
	{
		return lefttemp;
	}
	BTNode* righttemp = BinaryTreeFind(root->right,x);
	if (righttemp)
	{
		return righttemp;
	}

	return NULL;
}

递归展开图

相同的树

根比根,左子树比左子树,右子树比右子树

cpp 复制代码
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);
}

对称二叉树

第一步 :先比较根,然后开始比较左右子树的根;

第二步:开始比较左子树的左和右子树的右,比较左子树的右和右子树的左

cpp 复制代码
bool _isSymmetric(struct TreeNode* p,struct TreeNode* q);
bool isSymmetric(struct TreeNode* root) {
    if(root == NULL)
    {
        return false;
    }
    return _isSymmetric(root->left,root->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);
}

二叉树的前序遍历

cpp 复制代码
//可以看到需要返回数组的大小,所以我们可以求出二叉树的节点个数,用来开辟数组
 int TreeSize(struct TreeNode* root)
 {
    if(root == NULL)
        return 0;
    int left = TreeSize(root->left);
    int right = TreeSize(root->right);
    return left + right + 1;
 }
 //利用前序遍历的思路开始遍历
 void _preorderTraversal(struct TreeNode* root,int* a,int* i)
 {
    if(root == NULL)
    {
        return;
    }
    a[(*i)++] = root->val;
    _preorderTraversal(root->left,a,i);
    _preorderTraversal(root->right,a,i);

 }
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = TreeSize(root);
    int* a = (int*)malloc((*returnSize)*sizeof(int));
    int i = 0;
    _preorderTraversal(root,a,&i);
    return a;
}

另一棵树的子树

左边树里面的的子树都跟右边的树比较一下,一个一个根比较,每一个节点都是根

cpp 复制代码
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);
}

根据一个字符串创建二叉树

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
typedef struct BTNode
{
    char data;
    struct BTNode* left;
    struct BTNode* right;
}BTNode;
//首先我们需要一个创建树的函数
BTNode* BuyTreeNode(char a)
{
    BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
    newnode->data = a;
    newnode->left = NULL;
    newnode->right = NULL;

    return newnode;
}
BTNode* CreateTree(char* a,int *pi)
{
    if(a[*pi] == '#')
    {
        (*pi)++;
        return NULL;
    }
       
    //我们需要创建一个节点
    //前序遍历创建节点
    BTNode* newnode = BuyTreeNode(a[*pi]);
    (*pi)++;
    newnode->left = CreateTree(a,pi);
    newnode->right = CreateTree(a,pi);

    return newnode;
}

void Inorder(BTNode* root)
{
    if(root == NULL)
        return;
    Inorder(root->left);
    printf("%c ",root->data);
    Inorder(root->right);
}
int main() {
    //首先我们创建一个数组用来存放值
    char* a = (char*)malloc(sizeof(char)*100);
    scanf("%s",a);
    int i = 0;
    //然后构造一个创建树的函数
    BTNode* root = CreateTree(a, &i);
    Inorder(root);
    return 0;
}

层序遍历

cpp 复制代码
void LevelBTree(BTNode* root)
{
	//层序遍历
	assert(root);
	Queue q;
	QueueInit(&q);
	//首先把根节点push进去
	QueuePush(&q, root);
	while (!QueueEmpty(&q))
	{
		BTNode* front = QueueFront(&q);
		QueuePop(&q);
		printf("%d", front->data);
		//出来的时候把下一层节点带入队列中
		if (front->left)
			QueuePush(&q,front->left);
		if (front->right)
			QueuePush(&q,front->right);
	}
	QueueDestory(&q);
}
相关推荐
NAGNIP3 小时前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队4 小时前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
Fanxt_Ja8 小时前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下9 小时前
最终的信号类
开发语言·c++·算法
茉莉玫瑰花茶9 小时前
算法 --- 字符串
算法
博笙困了9 小时前
AcWing学习——差分
c++·算法
NAGNIP9 小时前
认识 Unsloth 框架:大模型高效微调的利器
算法
NAGNIP9 小时前
大模型微调框架之LLaMA Factory
算法
echoarts9 小时前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Python技术极客9 小时前
一款超好用的 Python 交互式可视化工具,强烈推荐~
算法