
宝子,你不点个赞吗?不评个论吗?不收个藏吗?
最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!
喵喵喵,你对我真的很重要。
目录
二叉树用C语言实现,会加些习题进行巩固练习。那么,就让我们开始吧! 喵~
一棵二叉树是结点的一个有限集合,该集合:
- 或者为空
- 由一个根节点加上两棵别称为左子树和右子树的二叉树组成
注意:
- 二叉树不存在度大于2的结点
- 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树
以下图片的树都是二叉树哦
- 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是 2^k ,则它就是满二叉树。(满二叉树
- 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。
如图所示:
- 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有 2^(i-1) 个结点.
- 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是 2^h-1 .
- 对任何一棵二叉树, 如果度为0其叶结点个数为 n0 , 度为2的分支结点个数为 n2 ,则有n0=n2 +1
- 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=log2(n+1)(ps:是log以2为底,n+1为对数)
- 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:
- i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点
- 若2i+1
,左孩子序号:2i+1,2i+1>=n否则无左孩子 - 若2i+2
,右孩子序号:2i+2,2i+2>=n否则无右孩子
- typedef char BTDataType;
-
- typedef struct BinaryTreeNode
- {
- BTDataType _data;
- struct BinaryTreeNode* _left;
- struct BinaryTreeNode* _right;
- }BTNode;
-
- // 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
- BTNode* BinaryTreeCreate(BTDataType* a, int n, int* pi);
- // 二叉树销毁
- void BinaryTreeDestory(BTNode** root);
- // 二叉树节点个数
- int BinaryTreeSize(BTNode* root);
- // 二叉树叶子节点个数
- int BinaryTreeLeafSize(BTNode* root);
- // 二叉树第k层节点个数
- int BinaryTreeLevelKSize(BTNode* root, int k);
- // 二叉树查找值为x的节点
- BTNode* BinaryTreeFind(BTNode* root, BTDataType x);
- // 二叉树前序遍历
- void BinaryTreePrevOrder(BTNode* root);
- // 二叉树中序遍历
- void BinaryTreeInOrder(BTNode* root);
- // 二叉树后序遍历
- void BinaryTreePostOrder(BTNode* root);
- // 层序遍历
- void BinaryTreeLevelOrder(BTNode* root);
- // 判断二叉树是否是完全二叉树
- int BinaryTreeComplete(BTNode* root);
- #include "BTree.h"
- #include "queue.h"
- #include "stack.h"
-
- BTNode *BinaryTreeCreate(BTDataType * src, int n, int* pi)
- {
- if (*pi >= n || src[*pi] == '#')
- {
- (*pi)++;
- return NULL;
- }
-
- BTNode * cur = (BTNode *)malloc(sizeof(BTNode));
- cur->_data = src[*pi];
- (*pi)++;
-
- cur->_left = BinaryTreeCreate(src, n, pi);
- cur->_right = BinaryTreeCreate(src, n, pi);
-
- return cur;
- }
-
- void BinaryTreePrevOrder(BTNode* root)
- {
- if (root)
- {
- putchar(root->_data);
- BinaryTreePrevOrder(root->_left);
- BinaryTreePrevOrder(root->_right);
- }
- }
-
- void BinaryTreeInOrder(BTNode* root)
- {
- if (root)
- {
- BinaryTreeInOrder(root->_left);
- putchar(root->_data);
- BinaryTreeInOrder(root->_right);
- }
- }
-
- void BinaryTreePostOrder(BTNode* root)
- {
- if (root)
- {
- BinaryTreePostOrder(root->_left);
- BinaryTreePostOrder(root->_right);
- putchar(root->_data);
- }
- }
-
- void BinaryTreeDestory(BTNode** root)
- {
- if (*root)
- {
- BinaryTreeDestory(&(*root)->_left);
- BinaryTreeDestory(&(*root)->_right);
- free(*root);
- *root = NULL;
- }
- }
-
- void BinaryTreeLevelOrder(BTNode* root)
- {
- Queue qu;
- BTNode * cur;
-
- QueueInit(&qu);
-
- QueuePush(&qu, root);
-
- while (!QueueIsEmpty(&qu))
- {
- cur = QueueTop(&qu);
-
- putchar(cur->_data);
-
- if (cur->_left)
- {
- QueuePush(&qu, cur->_left);
- }
-
- if (cur->_right)
- {
- QueuePush(&qu, cur->_right);
- }
-
- QueuePop(&qu);
- }
-
- QueueDestory(&qu);
- }
-
- int BinaryTreeComplete(BTNode* root)
- {
- Queue qu;
- BTNode * cur;
- int tag = 0;
-
- QueueInit(&qu);
-
- QueuePush(&qu, root);
-
- while (!QueueIsEmpty(&qu))
- {
- cur = QueueTop(&qu);
-
- putchar(cur->_data);
-
- if (cur->_right && !cur->_left)
- {
- return 0;
- }
-
- if (tag && (cur->_right || cur->_left))
- {
- return 0;
- }
-
- if (cur->_left)
- {
- QueuePush(&qu, cur->_left);
- }
-
- if (cur->_right)
- {
- QueuePush(&qu, cur->_right);
- }
- else
- {
- tag = 1;
- }
-
- QueuePop(&qu);
- }
-
- QueueDestory(&qu);
- return 1;
- }
简单
197
相关企业
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回 true;否则返回 false。
示例 1:

输入:[1,1,1,1,1,null,1] 输出:true
示例 2:

输入:[2,2,2,5,2] 输出:false 提示
[1, 100]。[0, 99] 。 - bool isUnivalTree(struct TreeNode* root){
- if(!root)
- {
- return true;
- }
- if(root->left)
- {
- if(root->val!=root->left->val || !isUnivalTree(root->left))
- {
- return false;
- }
- }
- if(root->right)
- {
- if(root->val!=root->right->val || !isUnivalTree(root->right))
- {
- return false;
- }
- }
- return true;
- }
简单
1.1K
相关企业
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:

输入:p = [1,2,3], q = [1,2,3] 输出:true
示例 2:

输入:p = [1,2], q = [1,null,2] 输出:false
示例 3:
输入:p = [1,2,1], q = [1,1,2] 输出:false
提示:

[0, 100] 内-104 <= Node.val <= 104 - bool isSameTree(struct TreeNode* p, struct TreeNode* q){
- if(p==NULL&&q==NULL)
- return true;
- else if(p==NULL||q==NULL)
- {
- return false;
- }
- else if(p->val!=q->val)
- {
- return false;
- }
- else{
- return isSameTree(p->left,q->left)&& isSameTree(p->right,q->right);
- }
-
- }
简单
2.6K
相关企业
给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:

输入:root = [1,2,2,3,4,4,3] 输出:true
示例 2:

输入:root = [1,2,2,null,3,null,3] 输出:false
提示:
[1, 1000] 内-100 <= Node.val <= 100- bool check(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 check(p->left,q->right)&&check(p->right,q->left);
- else
- return false;
- }
- bool isSymmetric(struct TreeNode* root){
- return check(root,root);
- }
来嘛,来嘛,笑一个,今天的你也是超级赞滴,喵~
宝子,你不点个赞吗?不评个论吗?不收个藏吗?
最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!
喵喵喵,你对我真的很重要。
