当前位置: 首页 > news >正文

铜陵app网站做招聘信息顺德网站制作公司哪家好

铜陵app网站做招聘信息,顺德网站制作公司哪家好,网站引导页模板,南京手机app开发公司目录 前言: 二叉树的概念与结构 二叉树的链式存储 二叉树的创建 二叉树的销毁 二叉树结点个数计算 二叉树叶子结点个数计算 二叉树第k层节点个数的计算 二叉树高度的计算 二叉树查找值为x的结点 二叉树的遍历 二叉树的前序遍历 二叉树的中序遍历 二叉树…

目录

前言:

二叉树的概念与结构

二叉树的链式存储

 二叉树的创建

二叉树的销毁

二叉树结点个数计算

二叉树叶子结点个数计算

二叉树第k层节点个数的计算

二叉树高度的计算

二叉树查找值为x的结点

 二叉树的遍历

二叉树的前序遍历

二叉树的中序遍历

二叉树的后序遍历

二叉树的层序遍历

判断二叉树是否为完全二叉树


前言:

二叉树的层序遍历需要使用队列实现,队列的实现见数据结构之队列,对于二叉树的代码,需要不断画递归展开图进行结合理解,递归展开图不展开描述;

二叉树的概念与结构

一棵二叉树是n个有限结点的集合,该集合或者为空,或者由一个称为根(root)的结点或者由一个根结点加上两棵别称为左子树和右子树的二叉树组成 ;

二叉树的链式存储

二叉树的链式存储结构指的是用链表表示一棵二叉树,即用链表指示元素的逻辑关系;

通常的方法是链表中每个结点由三个域组成,数据域与左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址;

 二叉树的创建

扩展二叉树是指在二叉树中出现空子树的位置增加空树叶,所形成的二叉树,使得子树成为满二叉树的二叉树叫做扩展二叉树;

先序遍历字符串 A B C # # # D # # 其中“#”表示的是空格,空格字符代表空树,则建立起来的二叉树如下图所示:

//二叉树结点结构
typedef int BTDataType;
typedef struct BinaryTreeNode
{struct BinaryTreeNode* left;struct BinaryTreeNode* right;BTDataType val;
}BTNode;
//创建二叉树,返回根结点地址
//A B C # # # D # #
BTNode* CreateTree(char* str, int* pi)
{if (str[*pi] == '#'){(*pi)++;return NULL;}BTNode* root = (BTNode*)malloc(sizeof(BTNode));root->val = str[*pi];(*pi)++;root->left = CreateTree(str, pi);root->right = CreateTree(str, pi);return root;}
int main()
{char arr[100] = { 'A', 'B', 'C', '#', '#', '#', 'D', '#', '#' };int i = 0;BTNode* root = CreateTree(arr, &i);return 0;
}

二叉树的销毁

按照先销毁其左子树,再销毁右子树,最后销毁根的顺序递归销毁二叉树;

void DestroyTree(BTNode* root)
{if (root == NULL)return;DestroyTree(root->left);DestroyTree(root->right);free(root);
}

二叉树结点个数计算

若根结点为空,则二叉树结点个数=0;

若根节点不为空,则二叉树结点个数=左子树的结点个数+右子树极点个数+1;

//二叉树结点个数
int TreeSize(BTNode* root)
{if (root == NULL)return 0;return TreeSize(root->left) + TreeSize(root->right) + 1;
}

二叉树叶子结点个数计算

叶子结点即某一节点出的左孩子为空并且右孩子为空则为叶子结点;

//二叉树叶子结点个数
int TreeLeafSize(BTNode* root)
{if (root == NULL)return 0;if (root->left == NULL && root->right == NULL)return 1;return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}

二叉树第k层节点个数的计算

规定:二叉树的层数K以1为起点,即第一层 k = 1;

二叉树的第k层节点个数=其左子树的第k-1层节点个数+其右子树的第k-1层节点个数;

int TreeKLevel(BTNode* root,int k)
{assert(k > 0);if (root == NULL)return 0;if (k == 1)return 1;return TreeKLevel(root->left, k - 1) + TreeKLevel(root->right, k - 1);
}

二叉树高度的计算

二叉树的高度=左子树的高度与右子树的高度较大值+1;

//二叉树的高度
int TreeHeight(BTNode* root)
{if (root == NULL)return 0;int LeftHeight = TreeHeight(root->left);int RightHeight = TreeHeight(root->right);return LeftHeight > RightHeight ? LeftHeight + 1 : RightHeight + 1;
}

二叉树查找值为x的结点

如根节点非空,先查找根,如果根结点处的值即为查找的值,直接返回根节点的地址,如果根节点处未查找到,先查找左子树,找到了直接返回,找不到继续查找右子树;

//二叉树查找值为x的结点
BTNode* TreeFind(BTNode* root, BTDataType x)
{if (root == NULL)return NULL;if (root->val == x)return root;struct BinaryTreeNode* ret = NULL;ret = TreeFind(root->left, x);if (ret != NULL)return ret;ret = TreeFind(root->right, x);if (ret != NULL)return ret;return NULL;
}

 二叉树的遍历

  • 前序遍历NLR(依次遍历:根结点—左子树—右子树)
  • 中序遍历LNR(依次遍历:左子树—根结点—右子树)
  • 后序遍历LRN(依次遍历:左子树—右子树—根结点)

 由于二叉树是递归定义的,按照下图所示方法,便可得到前序遍历的结点顺序

 前序遍历结果:A->B->D->E->C->F->G        

中序遍历结果为D->B->E->A->F->C->G;后序遍历结果:D->E->B->F->G->C->A;

二叉树的前序遍历

//二叉树的前序遍历
void PrevOrder(BTNode* root)
{if (root == NULL)return;printf("%c ", root->val);PrevOrder(root->left);PrevOrder(root->right);
}

二叉树的中序遍历

//二叉树的中序遍历
void InOrder(BTNode* root)
{if (root == NULL)return;InOrder(root->left);printf("%c ", root->val);InOrder(root->right);
}

二叉树的后序遍历

//二叉树的后序遍历
void PostOrder(BTNode* root)
{if (root == NULL)return;PostOrder(root->left);PostOrder(root->right);printf("%c ", root->val);
}

二叉树的层序遍历

二叉树的层序遍历是指将二叉树从上到下,从左到右依次遍历,如下图所示层序遍历结果为

A—>B—>D—>C

层序遍历的思路如下:

1.  判断根结点是否为空,非空则入队列

2. 判断队列是否为空,不为空则队头元素出队列,再将队头元素的孩子入队列,若队头元素的孩子为空,则不入队列;

3.判断队列是否为空,将B出队列,再将B的孩子入队列;

4.判断队列是否为空,将D出队列,再将D的孩子入队列;

5. 判断队列是否为空,将C出队列,再将C的孩子入队列;队列为空时结束遍历;

//二叉树的层序遍历
void BinaryTreeLevelOrder(BTNode* root)
{Queue q;InitQueue(&q);if (root != NULL)QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);printf("%c ", front->val);if (front->left != NULL);QueuePush(&q, front->left);if (front->right != NULL)QueuePush(&q, front->right);QueuePop(&q);}DestroyQueue(&q);
}

判断二叉树是否为完全二叉树

满二叉树:当二叉树深度为K,二叉树结点个数为2^k-1,则为满二叉树;

对满二叉树结点位置进行编号

  • 编号的规则:自上而下,从左向右 ;
  • 每一节点位置都有元素;

完全二叉树

深度为K具有n个结点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中的编号为1~n的节点一 一对应时,称为完全二叉树;

判断二叉树是否是完全二叉树,是完全二叉树返回true,否则返回false;
利用二叉树层序遍历,非空结点连续为完全二叉树,非空结点不连续,存在空节点,则为非完全二叉树;

int BinaryTreeComplete(BTNode* root)
{Queue q;InitQueue(&q);if (root != NULL)QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);if (front == NULL)break;QueuePush(&q, front->left);QueuePush(&q, front->right);QueuePop(&q);}//若已经出现空结点,队列后面结点存在非空结点,则为非完全二叉树while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);QueuePop(&q);if (front != NULL){DestroyQueue(&q);return false;}}DestroyQueue(&q);return true;
}

http://www.yayakq.cn/news/246268/

相关文章:

  • 专教做蛋糕的网站松江品划做网站
  • 南京市鼓楼区建设局网站建设摩托车质量怎么样
  • 郑州网站建设公司服务公司广州企业网站seo
  • angularjs做网站互站网官网
  • 织梦cms做网站流程有口碑的大连网站建设
  • 免费发布推广的网站有哪些百度广告代理公司
  • 郑州市建网站企业网站代维护
  • 网站做链接代码东莞设计网站
  • 网站建设的源代码有什么作用六安论坛百姓杂谈
  • 手机网站建设开发报价宁波网络营销咨询公司
  • 湖州高端网站设计wordpress模板哪里买
  • 有没有专业做steam创客的网站怎么做广告图片设计
  • 多网站建设邢台网约车新政策
  • 丰都专业网站建设公司黑龙江住房和城乡建设厅网站首页
  • 来年做那些网站致富mvc4 做网站
  • 公司做网站自己可以做北京搬家公司哪一家最好
  • 响应式博客网站模板thinkphp 微网站开发
  • 药企做网站网站建设 项目背景
  • h5网站制作平台网站seo计划
  • 行业网站怎么推广食药监局网站建设方案
  • 建设淘宝客网站.lc和ev对网站建设培训的建议
  • 天津建设局网站首页go语做网站
  • 网站建设 齐鲁软件园深圳个人外贸网站建
  • 网站建设系统分析可以搜索附近手机的软件
  • 可以写代码的网站有哪些问题吗深圳 网站建设培训班
  • 网站素材站美团广告投放平台
  • 购物商城网站建设做网站时随便弄上去的文章怎么删掉
  • 绵阳商城网站建设wordpress 摘要图片
  • 网站创建要多少钱外贸网站建设优化营销
  • 合肥高端网站建设设计php网站开发进程状态