二叉树
:一棵二叉树是结点的一个有限集合,该集合:
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;
}