几道简单的二叉树OJ题
Posted 小倪同学 -_-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了几道简单的二叉树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->right) &&isUnivalTree(root->left);
}
检查两颗树是否相同
题目简介
给你两棵二叉树的根节点 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);
}
对称二叉树
题目简介
给定一个二叉树,检查它是否是镜像对称的。
思路分析
- 在函数中创建一个子函数,传入根结点的左右子结点
- 在子函数中递归比较树的结点
代码实现
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);
}
bool isSymmetric(struct TreeNode* root){
if(root==NULL)
return true;
return _isSymmetric(root->left,root->right);
}
二叉树的前序遍历
题目简介
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
思路分析
- 先递归计算树结点个数
- 再根据树的大小开辟一块数组空间
- 构建子函数,将结点的数值递归赋值给开辟的数组空间
代码实现
int TreeSize(struct TreeNode* root)
{
if(root==NULL)
return 0;
return TreeSize(root->left)+TreeSize(root->right)+1;
}
void _preorderTraversal(struct TreeNode* root,int* pi,int* a)
{
if(root==NULL)
return;
a[(*pi)++]=root->val;
_preorderTraversal(root->left,pi,a);
_preorderTraversal(root->right,pi,a);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){
*returnSize=TreeSize(root);
int* a=(int*)malloc(sizeof(int)* *returnSize);
int i=0;
_preorderTraversal(root,&i,a);
return a;
}
中序,后序遍历相似,这里就不做过多赘述
另一颗树的子树
题目简介
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。
LeetCode 572
思路分析
递归比较以某一结点为根结点与subRoot树是否相同
代码实现
//比较以p为根结点的树与sunRoot树是否相同
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);
}
二叉树的构建及遍历
题目简介
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。
例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
二叉树遍历
思路分析
- 先构建字符数组,将字符串存入数组中
- 再创建一棵树,将字符数组的值赋值给树的结点
- 最后中序遍历打印结点数值
代码实现
#include<stdio.h>
#include<stdlib.h>
struct TreeNode
{
char vail;
struct TreeNode* left;
struct TreeNode* right;
};
struct TreeNode* CreateTree(char* str,int* pi)
{
if(str[*pi]=='#')
{
(*pi)++;
return NULL;
}
struct TreeNode* root=(struct TreeNode*)malloc(sizeof(struct TreeNode));
root->vail=str[(*pi)++];
root->left=CreateTree(str,pi);
root->right=CreateTree(str,pi);
return root;
}
void InOrder(struct TreeNode* root)
{
if(root==NULL)
return;
InOrder(root->left);
printf("%c ",root->vail);
InOrder(root->right);
}
int main()
{
char str[100];
scanf("%s",str);
int i=0;
struct TreeNode* root=CreateTree(str,&i);
InOrder(root);
}
以上是关于几道简单的二叉树OJ题的主要内容,如果未能解决你的问题,请参考以下文章