目录
单值二叉树
解题思路:遍历每一个节点,比较当前节点和他的左右子树,如果不同,就返回false。
代码:
bool isUnivalTree(struct TreeNode* root){
if(root==NULL)
{
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);
}
翻转二叉树
解题思路:遍历每一个节点并翻转它的左右子树。
void _inverTree(struct TreeNode* root)//单个树的翻转
{
if(root==NULL)
{
return ;
}
struct TreeNode*tmp=root->left;
root->left=root->right;
root->right=tmp;
}
struct TreeNode* invertTree(struct TreeNode* root){
if(root==NULL)
{
return NULL;
}
_inverTree(root);
invertTree(root->left);
invertTree(root->right);
return root;
}
相同的树
解题思路:类似前序遍历:先比较根节点是否相同,若相同,再比较左子树,然后再比较右子树。
代码:
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);
}
对称二叉树
解题思路:在相同的树基础上改编:将比较左右子树是否相同改成比较root1左子树与root2右子树是否相同。root1右子树与root2左子树是否相同。
代码:
bool _isSymmetric(struct TreeNode* root1,struct TreeNode* root2)
{
if(root1==root2)
{
return true;
}
if(root1==NULL||root2==NULL)
{
return false;
}
if(root1->val!=root2->val)
{
return false;
}
return _isSymmetric(root1->left,root2->right)&&_isSymmetric(root1->right,root2->left);
}
bool isSymmetric(struct TreeNode* root){
//思路:将issametree函数改编,root1左子树=root2右子树,
//root1右子树=root2左子树,比较root1和root2是否相同
if(root==NULL)
{
return true;
}
return _isSymmetric(root->left,root->right);
}
另一棵树的子树
解题思路:遍历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){
//思路:把每个节点形成的树都与subrot比较
if(root==subRoot)
{
return true;
}
if(root==NULL||subRoot==NULL)
{
return false;
}
if(isSameTree(root,subRoot))
{
return true;
}
return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}
高度平衡二叉树
解题思路:类似前序遍历:先比较根节点的左右子树高度是否平衡,然后再比较根节点的左子树和右子树是否高度平衡。
代码:
int BinaryTreeDepth(struct TreeNode* root)
{
if (root == NULL)
{
return 0;
}
int leftdepth = BinaryTreeDepth(root->left);
int rightdepth = BinaryTreeDepth(root->right);
return leftdepth > rightdepth ? leftdepth+1 : rightdepth+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);
}
二叉树的构建及遍历
解题思路:类似前序遍历:先构建树的根节点,再构建它的左右子树,最后返回根节点。
遍历数组时:若为空,直接返回空,若不为空,则先创立此节点,再构建此节点的左右子树。
代码:
#include <stdio.h>
#include<stdlib.h>
typedef char TreeData;
typedef struct Tree
{
TreeData data;
struct Tree* left;
struct Tree* right;
}Tree;
Tree* Create(char *a,int *pi)//创建树
{
if(a[*pi]=='#')
{
(*pi)++;
return NULL;
}
Tree* root=(Tree*)malloc(sizeof(Tree));
if(root==NULL)
{
perror("malloc");
exit(-1);
}
root->data=a[(*pi)++];
root->left=Create(a, pi);
root->right=Create(a, pi);
return root;
}
void postorder(Tree* root)
{
if(root==NULL)
{
return ;
}
postorder(root->left);
printf("%c ",root->data);
postorder(root->right);
}
void Destory(Tree**root)
{
if(*root==NULL)
{
return;
}
Destory(&(*root)->left);//先销毁左子树
Destory(&(*root)->right);//再销毁右子树
free(*root);//再销毁根节点
*root=NULL;//指针置空
}
int main() {
char arr[100];
while(scanf("%s",arr)!=EOF)
{
int i=0;
Tree* root= Create(arr, &i);
postorder(root);
Destory(&root);
}
return 0;
}
本篇文章到此结束。