关于二叉树方面的题

二叉树 :一棵二叉树是结点的一个有限集合,该集合:
1. 或者为空
2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成
如下图所示就是一个二叉树:

 

从上图可以看出:
1. 二叉树不存在度大于2的结点
2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

 注意:对于任意的二叉树都是由以下几种情况复合而成的:

下面我们来看两道题:

题目链接:. - 力扣(LeetCode)

对称二叉树:

给你一个二叉树的根节点 root , 检查它是否轴对称。

 

提示:

  • 树中节点数目在范围 [1, 1000] 内
  • -100 <= Node.val <= 100

 思路:

判断一个数是否对称,首先要判断左右孩子是否相等,还需要判断左孩子的左子树是否和右孩子的右子树对称,左孩子的右子树是否和右孩子的左子树对称。

代码:

bool _isSymmetric(struct TreeNode* left,struct TreeNode* right)
 {
    if(left==NULL&&right==NULL)
    {
        return true;
    }
    if(left==NULL||right==NULL)
    {
        return false;
    }
    return left->val==right->val
    &&_isSymmetric(left->left, right->right)
    &&_isSymmetric(left->right, right->left);
 }
bool isSymmetric(struct TreeNode* root) {
    if(root==NULL)
    {
        return true;
    }
    return _isSymmetric(root->left,root->right);
}

题目链接:二叉树遍历_牛客题霸_牛客网

二叉树遍历:

描述

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

输入描述:

输入包括1行字符串,长度不超过100。

输出描述:

可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。

示例1

输入:

abc##de#g##f###

输出:

c b e g d f a 

思路:

在先序遍历的过程中构建每一个节点,如果为‘#’,就为空,如果不是,就扩容继续向下走(递归),以指针的形式进行存储,最后创建中序遍历打印出来。

数组名就是自己的地址。

代码:

#include <stdio.h>
#include<malloc.h>
struct TreeNode{
    struct TreeNode*left;
    struct TreeNode*right;
    int val;
};
struct TreeNode* CreateTree(char*a,int *pi)
{
    if(a[*pi]=='#')
    {
        (*pi)++;
        return NULL;
    }
    struct TreeNode*root=(struct TreeNode*)malloc(sizeof(struct TreeNode));
    root->val=a[(*pi)++];
    root->left=CreateTree(a,pi);
    root->right=CreateTree(a,pi);
    return root;

};
void InOrder(struct TreeNode* root)
{
    if(root==NULL)
    {
        return;
    }
    InOrder(root->left);
    printf("%c ",root->val);
    InOrder(root->right);
}

int main()
{
    char a[100];
    scanf("%s",a);
    int i=0;
    struct TreeNode* root=CreateTree(a,&i);
    InOrder(root);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值