python知识图谱问答系统代码,布尔表达式Python
二叉树结构简单,存储效率高,算法简单。每个节点最多有两个子树,两个子树分左右,顺序不可逆。
二叉树的存储结构分为顺序存储结构和互锁存储结构。
1.顺序存储结构
对一棵树从上到下从左到右进行编号,并将编号依次存储在数组中,如下图所示。
如果数组中二叉树节点的索引号设置为I,则它具有以下属性。
(1)当I=0时,这个节点没有父节点,是根节点。
)对于i0,双亲的节点是(i-1 )/2,这里进行截断,留下整数位。
3)节点I的左孩子有2i 1,右孩子有2i 2。
)对于i0,当I为奇数时,是父节点的左子,兄弟是I1;当I为偶数时,它是父节点右边的子节点,兄弟节点是i-1。
5)深度为k的二叉树要按照长度为2 k-1的顺序记忆。
2.链式存储
当K值较大且空节点较多时,用逐次存储结构存储浪费较大,应采用链式存储结构进行存储。
3.遍历二叉树
树遍历的本质是将非线性结构线性化。
二叉树的深度优先扫描分为以下三种。(先左后右)。
1.先遍历,访问根节点,先遍历左边的子树,再遍历右边的子树。上图中的遍历结果是0134256。
2.按中间顺序遍历,按中间顺序遍历左侧子树,访问根节点,按中间顺序遍历右侧子树。遍历结果:3140526
3.后续遍历,后续遍历访问左侧子树,后续遍历访问右侧子树和根节点,遍历结果:3415620
代码实现:
类别:
类节点{//data private object _ data;//left子私有Node _ left;//right子privatenode _ right公共对象数据{ get { return _ data;} public node left { get { return _ left;} set { _ left=value} public node right { get { return _ right;} set { _ right=value} public node(object data){ _ data=data;}公共字符串测试(){return _data。ToString);}二叉树集合:
//head指针privatenode _ head//生成二叉树的字符串privatestring _ str公共节点头{ get { return _ head} public our tree(string Str){ _ Str=Str;//添加头node _ head=new node(_ str[0]);//添加子节点add(head,0)} PrivateVoidad (node parent,int index )//到头部节点//左侧子节点index int left index=2 * index1如果//index没有超过字符串长度if(leftindex_str.length )//#,则返回空节点 if _ str [left index]!= # ){//left child parent . left=new node(_ str[left index]);//递归调用Add将子节点add(parent.left,leftIndex)添加到左侧子节点;} } int rightIndex=2 * index 2right index _ str . length(if)_ str[right index]!= # ){ parent . right=new node(_ str[右索引]};add(parent.right,right index);}}三种遍历方式:
//Public void preorder(node))if)node first!=null () console.write)节点;preorder(node . left);preorder(node . right);()/中的顺序是publicvidmoder))Node))If)Node!=空值(midorder(node . left));console.write(节点;midorder(node . right);}//稍后遍历公共节点(node) (if)节点)!=empty(在order (node.left)之后);after order(node . right;console.write(节点;}测试代码:
ourtreetree=newourtree(abcde # f);tree . preorder(tree . head);控制台。WriteLine(;tree . midorder(tree . head);控制台。WriteLine(;tree . after order(tree . head;控制台。read key(;结果:
4.首先遍历二叉树的宽度
与深度优先遍历不同,广度优先遍历首先搜索所有的兄弟和堂兄弟节点,然后搜索后代节点。深度优先遍历首先搜索一个节点的所有后代,然后搜索它的兄弟节点。
先遍历,在队列中实现,没有递归。
代码如下所示。
public void level order(){队列节点queue=新队列节点);排队。入队(_ headwhile(排队。count 0)node node=(节点)队列.出列);控制台. write(节点;if(node.left!=null } { queue。排队(节点。左);(if ) node.right!=null } { queue。排队(节点。对);}对根节点进行排队,分别判断左右的孩子。
测试结果:
爵士摇滚
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。