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

wap手机网站建设seo上海优化

wap手机网站建设,seo上海优化,广东华业建设有限公司网站,做跨境电商网站目录 1. 二叉树结点总个数 思路1:全局或全局静态变量计数 思路2:分治思路 2. 二叉树叶子结点个数 3. 二叉树高度 4. 二叉树第k层的结点个数 5. 查找二叉树值为x的结点 本文中的测试二叉树结构如下: 1. 二叉树结点总个数 思路1&#x…

目录

1. 二叉树结点总个数

思路1:全局或全局静态变量计数

思路2:分治思路

2. 二叉树叶子结点个数

3. 二叉树高度

4. 二叉树第k层的结点个数

5. 查找二叉树值为x的结点


本文中的测试二叉树结构如下:

1. 二叉树结点总个数

思路1:全局或全局静态变量计数

创建全局整型变量或全局静态整型变量size对非空结点个数进行累加来计算结点总个数。如:

int size = 0;
// 二叉树结点总个数
int TreeSize(BTNode* root) {if (root == NULL) return 0;elsesize++;TreeSize(root->left);TreeSize(root->right);return size;
}
int main() {BTNode* root = CreateBinaryTree();printf("BinaryTreeNodesSize: ");printf("%d", TreeSize(root));printf("\nBinaryTreeNodesSize: ");printf("%d", TreeSize(root));printf("\nBinaryTreeNodesSize: ");printf("%d", TreeSize(root));return 0;
}

该思路不可行,全局变量与全局静态变量在程序生命周期中仅初始化一次,第一次调用结点计算函数结果正确,后续会由于静态变量不重新初始化而导致结果累积:

如果要通过全局变量或全局静态变量实现二叉树结点个数统计,则需在每次调用前将其置零:

int main() {BTNode* root = CreateBinaryTree();size = 0;printf("\nBinaryTreeNodesSize: ");printf("%d", TreeSize(root));size = 0;printf("\nBinaryTreeNodesSize: ");printf("%d", TreeSize(root));size = 0;printf("\nBinaryTreeNodesSize: ");printf("%d", TreeSize(root));return 0;
}

运行结果如下: 

但这种做法显然处理得不够简洁,需要另寻他法。

思路2:分治思路

若树为空,则结点个数为0;

若树不为空,则结点个数=左子树结点数+右子树结点数+1;

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

运行结果如下: 

注:创建局部整型变量size对非空结点个数进行累加来计算结点总个数的思路是不可行的,因为递归调用中每次调用会创建新的栈帧,这样计算是错误的。

2. 二叉树叶子结点个数

与二叉树结点总个数计算思路类似,此处仅展示分治思路实现叶子结点个数计算。

若树为空,则叶子结点个数为0;

若树非空,则叶子结点个数=左子树叶子结点个数+右子树叶子结点个数;

// 二叉树叶子结点个数
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);
}
int main() {BTNode* root = CreateBinaryTree();printf("\nBinaryTreeLeafNodesSize: ");printf("%d", TreeLeafSize(root));return 0;
}

3. 二叉树高度

同样采用分治思想:

若树为空,则二叉树高度为0;

若树非空,则二叉树高度为左子树与右子树中较高的那个子树的高度+1;

// 二叉树高度
int TreeHeight(BTNode* root) {if (root == NULL)return 0;int LeftTreeHeight = TreeHeight(root->left);int RightTreeHeight = TreeHeight(root->right);return LeftTreeHeight > RightTreeHeight ? LeftTreeHeight + 1 : RightTreeHeight + 1;
}
int main() {BTNode* root = CreateBinaryTree();printf("\nBinaryTreeHeight: ");printf("%d", TreeHeight(root));return 0;
}

注意:

1. 此处创建两个临时变量LeftTreeHeight和RightTreeHeight用于保存当前结点左子树和右子树的高度,没有采用两个临时变量的写法如下:

int TreeHeight(BTNode* root) {if (root == NULL)return 0;return TreeHeight(root->left) > TreeHeight(root->right) ? 
TreeHeight(root->left) + 1 : TreeHeight(root->right) + 1;
}

这种写法存在一定问题:在比较左右子树高度时,重复调用了两次递归函数(三目操作符比较一次,返回再计算一次)。每个节点的左右子树高度被重复计算,导致时间复杂度呈指数级增长,在树节点较多时会导致性能急剧下降,甚至栈溢出。

2. 也可包含math.h头文件后,使用fmax函数进行处理:

int TreeHeight(BTNode* root) {if (root == NULL)return 0;int LeftTreeHeight = TreeHeight(root->left);int RightTreeHeight = TreeHeight(root->right);return fmax(LeftTreeHeight, RightTreeHeight) + 1;
}

4. 二叉树第k层的结点个数

同样采用分治思想:

若二叉树为空,则返回0(无论k为何值该层结点数都为0);

在二叉树非空的情况下,若k==1,则返回1(说明当前结点就在第k层);

在二叉树非空的情况下,若k>1,则返回左子树第k-1层结点的个数+右子树k-1层结点的个数;

// 二叉树第K层结点个数
int TreeKLevelNode(BTNode* root,int k) {if (root == NULL)return 0;if (k == 1)return 1;return TreeKLevelNode(root->left, k-1) + TreeKLevelNode(root->right, k-1);
}
int main() {BTNode* root = CreateBinaryTree();printf("\nBinaryTree3LevelNodesSize: ");printf("%d", TreeKLevelNode(root, 3));return 0;
}

5. 查找二叉树值为x的结点

使用前序进行遍历(先根结点后子结点),分治思想:

如果二叉树为空,则返回NULL;

如果二叉树非空,先判当前根结点的值,与给定查找值x相等则返回当前根结点;

若当前根结点值给定查找值x不等,则依次查找当前根结点的左右子结点。

(若有多个结点的值都为x,返回第一个结点)

// 查找二叉树值为x的结点
BTNode* TreeFind(BTNode* root, BTDataType x) {if (root == NULL)return NULL;if (root->data == x)return root;BTNode* leftRet = TreeFind(root->left,x);if (leftRet)return leftRet;BTNode* rightRet = TreeFind(root->right, x);if (rightRet)return rightRet;return NULL;
}

注意点:

1. 递归调用TreeFind遍历左子树或右子树后,一定要创建指针变量接收递归调用的返回值;

2. 若在左子树找到了值为x的结点,直接返回即可,无需再遍历右子树;

http://www.dtcms.com/wzjs/276365.html

相关文章:

  • 企业网站推广的方式有哪些广州代运营公司有哪些
  • 上海网站建设公司招人2024年4月新冠疫情结束了吗
  • 站长工具在线免费观看广告推销
  • jsp动态网站开发实用教程做网页设计一个月能挣多少
  • 铁岭免费网站建设seo关键词排名优化怎么样
  • 深圳开发公司温州seo网站推广
  • 綦江建设银行网站品牌网络营销策划方案
  • 交互式网站模板四川seo推广公司
  • 网站建设公司上海做网站公司排名百度服务中心人工客服
  • 豫港大厦 做网站广告联盟接单平台
  • 域名申请好了 要怎么做网站企业qq官方下载
  • 网站设计有什么前景seo网站推广主要目的不包括
  • wordpress模板旅游排名优化公司哪家效果好
  • wordpress 关闭网站广州灰色优化网络公司
  • 武汉网站设计站建设2345网址大全
  • 教育类网站配色百度青岛代理公司
  • 广州营销型网站建设公司视频营销成功的案例
  • 网站快速建设入门教程网店如何引流与推广
  • 网站制作步骤流程图济南网络推广网络营销
  • 漯河公司做网站湖南长沙seo教育
  • 长沙做网站好的公司有哪些怎么在百度推广自己的网站
  • 上海医疗 网站制作地推一手项目平台
  • 如何网站平台建设好临沂seo建站
  • 使用vue.js做企业网站上海网站建设
  • 怎么找到做网站的客户优化seo是什么
  • wordpress log in杭州seo优化
  • 电子商务网站建设与维护pdf搜索引擎优化师工资
  • 做网站开发的过程厦门seo培训学校
  • 乡镇美丽乡村建设网站信息谷歌浏览器下载手机版安卓官网
  • 张家港网站制作公司数据推广公司