二叉树oj题

目录

单值二叉树 

翻转二叉树 

相同的树

对称二叉树

另一棵树的子树 

高度平衡二叉树

二叉树的构建及遍历


单值二叉树 

解题思路:遍历每一个节点,比较当前节点和他的左右子树,如果不同,就返回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;
}

 本篇文章到此结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嚞譶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值