IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【数据结构】二叉树经典基础习题 -> 正文阅读

[数据结构与算法]【数据结构】二叉树经典基础习题

目录

?单值二叉树

思路?

代码

相同的树

思路

代码

二叉树的前序遍历

思路

代码?

对称二叉树

思路

代码

另一棵树的子树

思路

代码

二叉树遍历(较难)

思路

代码?

平衡二叉树

思路

代码?


单值二叉树

OJ:如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。

只有给定的树是单值二叉树时,才返回?true;否则返回?false

思路

代码

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给你两棵二叉树的根节点?p?和?q?,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。?

思路

当前根节点和子树,分治思想

直接拿结果的情况:

第一种:p和q都为空

第二种:p为空,q不为空,或者p不为空,q为空

第三种:二者都不为空,p和q的值不相等

代码

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

时间复杂度:看递归次数,每个节点都要比常数次,这颗树有N个节点,递归N次,O(N)

空间复杂度:空间可以重复利用,最坏:O(h)= O(N)

二叉树的前序遍历

OJ给你二叉树的根节点?root?,返回它节点值的?前序?遍历。

思路

第一个问题:开多大的数组?——写一个子函数将这颗树的大小算出来

第二个问题:写一个子函数递归,把值往数组里面放!注意这里i得传址

代码?

int preorderSize(struct TreeNode*proot)//二叉树的大小
{
    if(proot == NULL)
    return NULL;
    else
    return 1+preorderSize(proot->left)+preorderSize(proot->right);
}
void _preorderTraversal(struct TreeNode*root,int*arr,int*i)
{
    if(root == NULL)
    return;
    arr[(*i)++] = root->val;//根
    _preorderTraversal(root->left,arr,i);//左子树
    _preorderTraversal(root->right,arr,i);//右子树
}

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

对称二叉树

OJ给定一个二叉树,检查它是否是镜像对称的。

思路

左右比较,所以在这里加一个子函数

左子树的左孩子VS右子树的右孩子

左子树的右孩子VS右子树的左孩子

代码

bool _isSymmetric(struct TreeNode* pleft,struct TreeNode* pright)
    {
        if(pleft == NULL && pright == NULL)
        return true;

        if(pleft == NULL || pright == NULL)
        return false;

        if(pleft->val != pright->val)
        return false;

        return _isSymmetric(pleft->left,pright->right) && _isSymmetric(pleft->right,pright->left);
    }

bool isSymmetric(struct TreeNode* root)
{
    if(root == NULL)
    return true;
    return _isSymmetric(root->left,root->right);
}

另一棵树的子树

?OJ给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

思路

遍历一下root,拿到每个子树的根,跟subRoot这颗树比较

调用两树相同的代码

代码

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

二叉树遍历(较难)

IO

思路

先构建出这个二叉树,然后在进行中序遍历

代码?

#include<stdio.h>
#include<stdlib.h>
struct TreeNode
{
	char val;
	struct TreeNode*left;
	struct TreeNode*right;
};
//构建这颗二叉树
struct TreeNode* CreateTree(char*str, int*i)
{
	if (str[(*i)] == '#')
	{
		(*i)++;
		return NULL;
	}
	struct TreeNode*root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
	root->val = str[(*i)++];
	root->left = CreateTree(str, i);
	root->right = CreateTree(str, i);
	return root;
}
//中序遍历
void InOrder(struct TreeNode* root)
{
	if (root == NULL)
		return;
	InOrder(root->left);
	printf("%c ", root->val);
	InOrder(root->right);
}

int main()
{
	char str[100];
	scanf("%s", str);
	int i = 0;
	struct TreeNode* root = CreateTree(str, &i);//构建这颗二叉树
	InOrder(root);//中序遍历
	return 0;
}

平衡二叉树

OJ给定一个二叉树,判断它是否是高度平衡的二叉树。

一棵高度平衡二叉树定义为:一个二叉树每个节点?的左右两个子树的高度差的绝对值不超过 1 。

思路

1,树若为空,则返回true

2,求root左子树的高度和root右子树的高度

3,检测root左右子树是否满足平衡二叉树的定义----->高度差的绝对值

4,递归root左子树&&root右子树

代码?

int BinaryTreeDepth(struct TreeNode*root)
{
    if(root == NULL)
    return 0;
    int leftleaf = BinaryTreeDepth(root->left);
    int rightleaf = BinaryTreeDepth(root->right);
    return leftleaf > rightleaf ? leftleaf+1:rightleaf+1;
}
bool isBalanced(struct TreeNode* root)
{
    if(root == NULL)
    return true;
    if(abs( BinaryTreeDepth(root->left) - BinaryTreeDepth(root->right) )>1)
    return false;

    return  isBalanced(root->left) && isBalanced(root->right);
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-03 17:18:25  更:2021-10-03 17:18:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:47:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码