这是关于“树先生“的故事

这篇具有很好参考价值的文章主要介绍了这是关于“树先生“的故事。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


这是关于“树先生“的故事


《数据结构专栏》



一、认识树结构

树的定义:树是指由N(N>=0)个有限结点组成的具有层次性关系的集合,是一种简单的非线性结构。当N=0时,称为空树。

如何遍历树

前序遍历
这是关于“树先生“的故事

中序遍历
这是关于“树先生“的故事

后序遍历
这是关于“树先生“的故事

对于前中后序遍历使用的是根节点的位置决定前中序。

层序遍历

对于层序来说就是一层一层的进行遍历,由上面一层的根节遍历后带入下一层的节点数据。可以使用一个辅助队列的容器来实现对于层序遍历。
这是关于“树先生“的故事
代码实现

//层序遍历
void BinaryTreeLevelOrder(BTNode* root)
{
	Queue qu;
	BTNode* cur;

	QueueInit(&qu);

	QueuePush(&qu, root);

	while (! QueueEmpty(&qu))
	{
		cur = QueueFront(&qu);

		putchar(cur->_data);

		if (cur->_left)
		{
			QueuePush(&qu, cur->_left);
		}

		if (cur->_right)
		{
			QueuePush(&qu, cur->_right);
		}

		QueuePop(&qu);
	}

	QueueDestory(&qu);
}

如何创建一个树?

对于二叉树的遍历就是前、中、后序遍历。对于前序和后序遍历可以快速的找到根节点。然后通过中序分辨出左右子树。实现对于树的构建。

编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
输入:abc ## de #g ## f ###
输出:c b e g d f a

构建树
这是关于“树先生“的故事
输入时是一个数组来进行数据存储的,所以在建立树的节点时就需要使用一个数据记录数组下标。
这是关于“树先生“的故事
避免在递归时数组的下标使用后,返回下标重置,这里需要保持数组下标一致向后走,递归出来后才会对于整个数组遍历。使用的一个前序思想建树。

typedef  struct TreeNode
{
    struct TreeNode* left;
    struct TreeNode* right;
    char val;
}TreeNode;

TreeNode* makeTree(char* arr,int *count)
{
    if(arr[*count]=='#'||arr[*count]==' ')
    {
        return NULL;
    }

    TreeNode* newnode=(TreeNode*)malloc(sizeof(TreeNode));
    newnode->val=arr[(*count)++];

    newnode->left=makeTree(arr, count);
    (*count)++;
    newnode->right=makeTree(arr, count);

    return newnode;
}

void InOrder(TreeNode*root)
{
    if(root==NULL)
    return ;

    InOrder(root->left);
    printf("%c ",root->val);
    InOrder(root->right);
}

int main()
{

    char arr[101];
    scanf("%s",arr);
    int count=0;
    TreeNode*tree=makeTree(arr, &count);
    InOrder(tree);
    return 0;
}

如何判断一颗树是否是完全二叉树?

这是关于“树先生“的故事
通过对于满二叉树和完全二叉树的对比发现完全二叉树的底层叶子结点数目是从左向右依次递减的,所以高度为n-1层的数目是不变的满二叉树一样,对于完全二叉树的最后一层进行分析即可。

对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对
于序号为i的结点有:

  1. 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点
  2. 若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子
  3. 若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子

代码实现

int BinaryTreeComplete(BTNode* root)
{
	Queue qu;
	BTNode* cur;
	int tag = 0;

	QueueInit(&qu);

	QueuePush(&qu, root);

	while (! QueueEmpty(&qu))
	{
		cur = QueueFront(&qu);

		putchar(cur->_data);

		if (cur->_right && !cur->_left)
		{
			return 0;
		}

		if (tag && (cur->_right || cur->_left))
		{
			return 0;
		}

		if (cur->_left)
		{
			QueuePush(&qu, cur->_left);
		}

		if (cur->_right)
		{
			QueuePush(&qu, cur->_right);
		}
		else
		{
			tag = 1;
		}

		QueuePop(&qu);
	}

	BinaryTreeDestory(&qu);
	return 1;
}

二、树的简单算法——递归

1.相同树

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的
这是关于“树先生“的故事

对于题目讲解的相同理解应该是节点数据相同的数据,且左右子树结构也是相同的,对于空树的判断应该也要讨论,其中一颗树为空,另外一颗树不为空就明显不是相同的数。对于判断条件就是val值,左右子树结构,是否同时为空(判断是否都是叶子结点)。

class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if(p==nullptr&&q==nullptr)return true;
        
        if(p==nullptr||q==nullptr)return false;

       if(q->val!=p->val)return false;


        return isSameTree(q->left,p->left)&&isSameTree(q->right,p->right);
    }
};

2.镜像树

给你一个二叉树的根节点 root , 检查它是否轴对称
这是关于“树先生“的故事

镜像树和解法有些类似于上面的相同树,但是又有些许差别就是对于树的结构比较他们是左子树和右子树的是对称的,使用的相同树的逻辑解题。

class Solution {
public:
    bool issametree(TreeNode* root,TreeNode* subroot)
    {
        if(root==nullptr && subroot==nullptr)
        {
            return true;
        }
        if(root==nullptr || subroot==nullptr)
        {
            return false;
        }
         
        if(root->val==subroot->val)
        {
            return issametree(root->left,subroot->right) && issametree(root->right,subroot->left);
        }
        else
        {
            return false;
        }
    }
    bool isSymmetric(TreeNode* root) {
        if(root==nullptr) return true;
        return issametree(root->left,root->right);
    }
};

3.单值二叉树

题目: 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时,才返回 true;否则返回 false。
这是关于“树先生“的故事

对于二叉树中值的查找值是一个比较常用的算法,使用深度遍历,从左子树到后面右子树依次遍历。不能使用节点数据相加后对比左右子树。会存在左边是多节点,右边只有一个节点数据。但是左右子树的值依旧相等。所以需要从根得va来比较判断左右子树。

class Solution {
public:
    bool isUnivalTree(TreeNode* root) {
        if(root==nullptr)return true;

        if(root->left&&root->val!=root->left->val)
        return false;
        if(root->right&&root->val!=root->right->val)
        return false;
      
        
        return isUnivalTree(root->left)&&isUnivalTree(root->right);
    }
};

总结

树的结构使用递归算法来进行遍历很容易理解,但是对于深度太深的树就会出现栈溢出情况。树用来存储数据显然不是一个很好的选择,容易出现歪脖子树,单只树。效率不高。可以进行后期优化成为搜索二叉树,AVL树……文章来源地址https://www.toymoban.com/news/detail-451851.html

到了这里,关于这是关于“树先生“的故事的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JavaSE专栏89】Java字符串和XML数据结构的转换,高效灵活转变数据

    作者主页 :Designer 小郑 作者简介 :3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。 主打方向 :Vue、SpringBoot、微信小程序 本文讲解了 XML 的概念,以及 Java 中 XML 和字符串的转换方法,并给出了样例代码。

    2024年02月09日
    浏览(58)
  • 【Java程序员面试专栏 数据结构】四 高频面试算法题:哈希表

    一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,一个O(1)查找的利器哈希表,所以放到一篇Blog中集中练习 题目 解题思路 时间 空间 两数之和 辅助哈希 使用map存储出现过的值,key为值大小,v

    2024年02月22日
    浏览(59)
  • 【JavaSE专栏48】Java集合类ArrayList解析,这个动态数组数据结构你了解吗?

    作者主页 :Designer 小郑 作者简介 :3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。 主打方向 :Vue、SpringBoot、微信小程序 本文讲解了 Java 中集合类 ArrayList 的语法、使用说明和应用场景,并给出了样例代码。

    2024年02月16日
    浏览(60)
  • 【JavaSE专栏55】Java集合类HashTable解析,基于哈希表实现的唯一性键值对存储数据结构

    作者主页 :Designer 小郑 作者简介 :3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。 主打方向 :Vue、SpringBoot、微信小程序 本文讲解了 Java 中集合类 HashTable 的语法、使用说明和应用场景,并给出了样例代码。

    2024年02月15日
    浏览(57)
  • 关于对索引底层数据结构的理解

    目录 我们在谈论索引底层的数据结构之前,我们不妨先想一下索引是什么以及索引存在的作用 Hash 二叉搜索树与二叉平衡树 多叉平衡查找树(B树) B+树 索引:是一种特殊的文件,包含着对数据库表中所有记录的引用指针,而其的作用也体现的很明确了,我们通过创建索引来

    2024年02月09日
    浏览(45)
  • 数据结构:关于时间复杂度的例题计算

    该程序,最上面的嵌套循环里,i每执行一次,j就执行N次,所以嵌套循环执行次数为N*N次;中间的k变量循环了2*N次;最后M变量循环10次。所以总共执行了 N*N+2*N+10 次! 所以该程序时间复杂度为 O(N 2 ) 。 该程序,上面的for循环执行了2*N次,下面的M循环了10次。所以该时间复杂

    2024年02月07日
    浏览(46)
  • 【数据结构】关于排序你应该知道的一切(下)

    和光同尘_我的个人主页 单程孤舟,出云入霞,如歌如吟。 --门孔 啊还是国庆快乐!上节介绍了较为简单的插入排序、选择排序,今天我们上强度,学习交换排序、归并排序还有计数排序,开冲😎 2.1.1. 基本思想 关于冒泡排序我们在C语言的学习中就有涉及 依次比较序列中相

    2024年02月05日
    浏览(38)
  • 【数据结构】-关于树的概念和性质你了解多少??

    作者:小树苗渴望变成参天大树 作者宣言:认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! 今天我们来讲一讲非线性的一种数据结构,大家肯定对这种结构充满好奇和不解,今天我就带大家来解决这个问题,我所将的是树以及

    2024年02月02日
    浏览(44)
  • [C语言实现]数据结构之《关于我转生成队列这档事》

    🥰作者: FlashRider 🌏专栏: 数据结构 🍖知识概要:详解 队列 的概念、顺序队列和链式队列的优点和缺点,以及代码实现。 目录 什么是队列? 选择什么结构来实现队列? 链式队列的实现 队列的结构体实现 队列需要的函数声明 队列的函数实现 测试代码 队列其实就是一种操

    2024年02月09日
    浏览(32)
  • 【Redis】关于Redis数据结构简单动态字符串(SDS)的一些杂记

    推荐几篇关于SDS数据结构讲解较为详细的文章: 一、简单动态字符串 — Redis 设计与实现 (redisbook.readthedocs.io) 二、深入理解Redis之简单动态字符串 - itbsl - 博客园 (cnblogs.com) 三、Redis内部数据结构详解(2)——sds - 铁蕾的个人博客 (zhangtielei.com) 四、简单动态字符串 — Redis 设计与

    2023年04月14日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包