博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树的宽度和深度
阅读量:5064 次
发布时间:2019-06-12

本文共 1660 字,大约阅读时间需要 5 分钟。

在之前的博客中,博主给出了对于层序遍历算法的核心思想的分析。而层序遍历这样一种从左至右,一层一层访问的思想,与求解二叉树的宽度和高度的思路是十分贴合的,几乎可以直接将层序遍历的算法代码拿过来用。当然,一点必要的修改是需要的。

1. 二叉树的宽度

  若某一层的节点数不少于其他层次的节点数,那么该节点数即为二叉树的宽度。在访问过程中,我们只需要将同一层中的节点同时入栈即可。为此,我们也只需要知道上一层队列中元素的多少,在将该queue中所有元素出队列的同时,将下一层的元素进队列,完成交接。这样,便可以清晰地知道每一层中节点的多少,自然也知晓树的宽度。

1 int treeWidth(Bitree *root){ 2   if(!root){ 3     return 0; 4   } 5   int width = 0; 6   int maxWidth = 0; 7   queue
Q; 8 Bitree *p = nullptr; 9 Q.push(root);10 while(!Q.empty()){11 width = Q.size();12 if(maxWidth < width){13 maxWidth = width;14 }15 for(int i=0; i
left){19 Q.push(p->left);20 }21 if(p->right){22 Q.push(p->right);23 }24 }25 }26 return maxWidth;27 }

2. 树的高度

  在上述算法中,知道了每一层中节点的个数,其实也很容易知道树的高度,简直就是顺便的事。由此,可以给出相应的非递归算法。

1 int treeHeight2(Bitree *root){ 2   if(!root){ 3     return 0; 4   } 5   int height = 0; 6   int width = 0; 7   queue
Q; 8 Bitree *p = nullptr; 9 Q.push(root);10 while(!Q.empty()){11 width = Q.size();12 height++;13 for(int i=0; i
left){17 Q.push(p->left);18 }19 if(p->right){20 Q.push(p->right);21 }22 }23 }24 return height;25 }

当然,对于树的高度,还有一种代码简洁的递归算法,也一并呈上。

1 int treeHeight1(Bitree *root){2   if(!root){3     return 0;4   }5   int leftHeight = treeHeight1(root->left);6   int rightHeight = treeHeight1(root->right);7   return leftHeight>rightHeight ? leftHeight+1 :rightHeight+1;8 }

递归思想其实很简单,代码也清晰易懂,即左右子树的较高者加上1(root高度为1)即可。树的高度等价于从根节点到叶子节点的最长路径的长度,后续博主也会讨论到其他变体,例如求解从根节点到叶子节点的最短路径长度。

转载于:https://www.cnblogs.com/wuiCoding/p/6672383.html

你可能感兴趣的文章
JS 浏览器对象
查看>>
TestNG入门
查看>>
【ul开发攻略】HTML5/CSS3菜单代码 阴影+发光+圆角
查看>>
虚拟中没有eth0
查看>>
Unity 3D游戏开发学习路线(方法篇)
查看>>
BZOJ2049[Sdoi2008]Cave 洞穴勘测(LCT模板)
查看>>
vuex插件
查看>>
2011年12月09日
查看>>
[ZJOI2007]棋盘制作 【最大同色矩形】
查看>>
合并单元格
查看>>
swift-初探webView与JS交互
查看>>
IOS-图片操作集合
查看>>
Android bitmap图片处理
查看>>
Android应用程序进程启动过程的源代码分析
查看>>
adb logcat 命令行用法
查看>>
Redis学习手册(Key操作命令)
查看>>
模板统计LA 4670 Dominating Patterns
查看>>
泛型第23条:请不要在新代码中使用原生态类型
查看>>
非对称加密
查看>>
bzoj 3413: 匹配
查看>>