965. 单值二叉树

思路:

1.若树为空,则返回true,因为并不违反规则。

2.将根结点和左子树右子树的值做比较,若不相等就返回false.

3.递归实现先序遍历即可,即左子树比完再比右子树,且都得相等。

bool isUnivalTree(struct TreeNode* root){//先序遍历if(root == NULL)return true;//判断==并没有多大的用处,判断相反可快速结束递归。if(root->left && root->val != root->left->val)//1.判断节点是否存在,2.判断值是否不相等。return false;if(root->right && root->val != root->right->val)return false;return isUnivalTree(root->left) && isUnivalTree(root->right);//左树 右树都得同时满足才可返回真}

100. 相同的树

在两棵树的比较,就是看对应节点是否存在且相等。

思路:1.若两棵树都为空,则返回true。

2.若两棵树对应节点有缺失,则返回false

3.递归,前序遍历即可。

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 _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->right) && _isSameTree(p->right,q->left);}bool isSymmetric(struct TreeNode* root){//为空树if(root == NULL)return true;//调用相同树的代码return _isSameTree(root->left,root->right);}

二叉树的前序遍历

复习:前序遍历:根 - 左子树 - 右子树

总之还是递归分治的思想,但是,这道题又有点不同。

这道题要自己申请一个数组空间来存储数据,使用静态的数组会因为函数栈帧的缘故,当函数出了作用域时,就会被销毁,返回的值可能就根本”不存在“。而static修饰的静态局部变量,多次调用,就会出现数据覆盖的问题,最优解就是:在堆上开辟空间,那开多大的空间?

我们可以先遍历一遍二叉树,获得二叉树的节点个数,相应的代码及思路已经在之前的博客中提及过了。

思路:1.先序遍历的思想

2.递归求节点的个数。

2.动态开辟数组。

 int BTreeSize(struct TreeNode* root)
{return root == NULL? 0:BTreeSize(root->left)+BTreeSize(root->right)+1;
}
void _preorder(struct TreeNode* root,int* a,int* pi)
{if(root == NULL)return ;a[(*pi)++] = root->val;_preorder(root->left,a,pi);_preorder(root->right,a,pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){//确定树的大小*returnSize = BTreeSize(root);int* a = (int*)malloc(sizeof(int)*(*returnSize));int i =0;_preorder(root,a,&i);return a;
}

二叉树的后序遍历

后序遍历:左子树 - 右子树 - 根

思路与上面的前序遍历一致

int BTreeSize(struct TreeNode* root)
{return root == NULL? 0:BTreeSize(root->left)+BTreeSize(root->right)+1;
}
void _preorder(struct TreeNode* root,int* a,int* pi)
{if(root == NULL)return ;_preorder(root->left,a,pi);_preorder(root->right,a,pi);a[(*pi)++] = root->val;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize){*returnSize = BTreeSize(root);int* a = (int*)malloc(sizeof(int)*(*returnSize));int i =0;_preorder(root,a,&i);return a;}

二叉树的中序遍历

int BTreeSize(struct TreeNode* root)
{return root == NULL? 0:BTreeSize(root->left)+BTreeSize(root->right)+1;
}
void _preorder(struct TreeNode* root,int* a,int* pi)
{if(root == NULL)return ;_preorder(root->left,a,pi);a[(*pi)++] = root->val;_preorder(root->right,a,pi);}
int* inorderTraversal(struct TreeNode* root, int* returnSize){*returnSize = BTreeSize(root);int* a = (int*)malloc(sizeof(int)*(*returnSize));int i =0;_preorder(root,a,&i);return a;
}

另一棵树的子树

本质上就是寻找子树的问题,当大树的一个小树和所给定的小树的结构和值完全相等时,返回true

考虑调用判断两个数是否相同的函数代码,采用分治的思想,先跑完左子树寻找,再跑右子树寻找,期间若找到了,就直接返回true。

主要还是分支的思想。

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 && subRoot == NULL)return true;if(root == NULL || subRoot == NULL)return false;//判断其是否为相同的树,找完左树找右树return _isSameTree(root,subRoot) || isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}

二叉树遍历

思路:1)建树,递归分治建树。

2)传递参数时,要传递指针,传值调用,传递的是形参,形参的改变不会影响实参,所以递归时就会出错。

3)中序遍历,左子树 - 根 - 右子树

#include<stdio.h>
#include<stdlib.h>
typedef struct BTreeNode
{char data;struct BTreeNode* left;struct BTreeNode* right;
}BTNode;
BTNode* CreatTree(char *a, int *pi)//这里必须传递指针 pi
{//递归方式创建树,那么就必须传址调用,而不是传值调用。//如果是‘#’就返回NULL,同时找数组下一位if(a[*pi] == '#'){(*pi)++;return NULL;}//创建树BTNode* root = (BTNode*)malloc(sizeof(BTNode));root->data = a[(*pi)++];root->left = CreatTree(a, pi);root->right = CreatTree(a, pi);return root;
}
void InOrder(BTNode* root)
{if(root == NULL)return;InOrder(root->left);printf("%c ",root->data);InOrder(root->right);
}
int main()
{char a[100];scanf("%s",a);//创建树int i = 0;BTNode* Tree = CreatTree(a,&i);InOrder(Tree);return 0;
}

【数据结构】二叉树经典习题相关推荐

  1. 【二叉树经典习题讲解】

    If you find a path with no obstacles, probably doesn't lead anywhere. 目录 1 前中后序遍历一颗二叉树 2 总的结点个数 3 求叶 ...

  2. 数据结构经典习题【part 1】

    学习数据结构遇到的一些经典习题 part 1 顺序表习题 消失的数字 数组nums包含从0到n的所有整数,但其中缺了一个.请编写代码找出那个缺失的整数.你有办法在O(n)时间内完成吗? 思路一: 1. ...

  3. 数据结构经典习题【part2】

    一些数据结构经典习题 part 2 链表 1.给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 . struct ...

  4. 二叉树----数据结构:二叉树的三种遍历及习题

    二叉树----数据结构:二叉树的三种遍历,利用递归算法. 关于二叉树的遍历,应用非常广泛,不单单是访问打印结点,还可以进行一系列的操作,如赋值.删除.查找.求二叉树的深度等等. 有递归和非递归两种算法 ...

  5. 数据结构 -- 二叉树

          这篇文章介绍的是经典的数据结构--二叉树,在这篇文章里介绍了几乎二叉树的所有操作.       二叉树给我们最重要的印象莫过于递归,因为这棵树就是递归的,所以,我在解决各个问题时大部分都用 ...

  6. 数据结构 - 二叉树 - 面试中常见的二叉树算法题

    数据结构 - 二叉树 - 面试中常见的二叉树算法题 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组.链表).栈与队列.树(二叉树.二叉查找树.平衡二叉树.红黑树).图 ...

  7. 3. 数据结构--二叉树 BST AVL树 Huffman

    数据结构–二叉树 KEY:(不敢相信没有堆-) 二叉树的定义及其主要特征 ☑️ 二叉树的顺序存储结构和链式存储结构实现 二叉树的遍历及应用 二叉排序(查找.检索)树 (BST) 平衡的二叉检索树- A ...

  8. 已知长短轴求椭圆上任意一点的坐标_高中数学必修2:平面解析几何——椭圆(经典习题)...

    今天接着给大家分享关于高中数学必修2平面解析几何中椭圆知识点讲解,从三个方面进行讲解:基础梳理.要点整理.经典高考习题解题过程及答案. 一.基础梳理 1.椭圆的定义 2.椭圆的标准方程和几何性质 要点 ...

  9. 数据结构——二叉树的递归算法

    二叉树的结构定义: typedef struct BiNode {TElemType data;struct BiNode *lchild;struct BiNode *rchild; }BiNode ...

  10. 数据结构——二叉树的层次遍历进阶

    之前的一个博客 数据结构--二叉树的层次遍历看完这个,可以简单实现下面的问题 问题: 1.计算二叉树的最大宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值. 2.用按层次顺序遍历二叉树的方法, ...

最新文章

  1. C语言小知识:typedef\函数模板\
  2. TFS 2010 使用手册(二)项目集合与项目
  3. 2017寒假第一篇随笔(寒假作业一)
  4. Redis工具类封装讲解和实战
  5. error: uuid/uuid.h: No such file or directory
  6. 专访杨开振:程序员除了敲代码还能做什么?
  7. 上传html 0字节,HTML ajax 上传文件限制文件的类型和文件大小
  8. pytorch保存和加载文件的方法,从断点处继续训练
  9. delphi 中 的 Split 函数
  10. 学位论文多级标题编号与图表编号
  11. linux7telnet测试通是提示如何,如何优雅的使用telnet测试端口连通性
  12. heartbeat+DRBD+mysql高可用集群实战
  13. SQL-55 分页查询employees表,每5行一页,返回第2页的数据
  14. IOS APP提交流程
  15. 如何写好一份软件开发设计文档
  16. 微软服务器登录不上,微软账号无法登录怎么办
  17. win10怎么显示文件后缀_win10系统中使用win7照片查看器(无需下载安装)
  18. CentOS8 防火墙设置
  19. java中extends用法_JAVA的extends用法
  20. ​AD设置丝印到阻焊的间距,并分析丝印重叠对阻焊的影响

热门文章

  1. 整理PC端微信文件夹
  2. 创新工场5位创业者2011创业感悟
  3. Arch 使用 i3 美化桌面
  4. document 使用方法介绍
  5. 100层楼两个杯子找杯子碎的临界点
  6. IT行业岗位薪资大调查:收入最高的职位是什么?
  7. MaskGAN:Towards Diverse and Interactive Facial Image Manipulation翻译
  8. 企业上云是什么意思?企业上云的好处是什么?
  9. php获取谷歌邮箱,php 获取gmail 联系人邮箱,应用oauth2.0验证
  10. 利用selenium webdriver下载不同类型的文件(pdf,txt等等)