二叉树

✍ dations ◷ 2024-12-22 16:04:59 #自2015年4月包含过多范例的条目,数据结构,树结构,二叉树

在计算机科学中,二叉树(英语:Binary tree)是每个节点最多只有两个分支(即不存在分支度大于2的节点)的树结构。通常分支被称作“左子树”或“右子树”。二叉树的分支具有左右次序,不能随意颠倒。

二叉树的第 i {\displaystyle i} 。这种方法更有利于紧凑存储和更好的访问的局部性,特别是在前序遍历中。然而,它需要连续的存储空间,这样在存储高度为的个节点所组成的一般树时,将浪费很多空间。在最糟糕的情况下,如果深度为h的二叉树其每个节点都只有右孩子,则该存储结构需要占用 2 h 1 {\displaystyle 2^{h}-1} 是二叉搜索树的结点,那么的左子树的所有结点的值都比n的值要小,而且的右子树的所有节点的值都比n的值要大。因此,如果我们顺序遍历左子树,然后访问,然后顺序遍历右子树。我们就已经循序访问了整个树。

后序遍历伪代码如下:

visit(node)    if node.left  != null then visit(node.left)    if node.right != null then visit(node.right)    print node.value
BinaryTree
在这个二叉树中,
  • 前序遍历的结果:M,G,D,B,A,C,F,E,J,H,I,K,L,S,P,O,N,Q,R,W,U,T,V,X,Z,Y
  • 后序遍历的结果:A,C,B,E,F,D,I,H,L,K,J,G,N,O,R,Q,P,T,V,U,Y,Z,X,W,S,M
  • 中序遍历的结果:A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z


以上的递归算法使用与树的高度成比例的栈空间。如果我们在每个结点中存储指向父结点的指针,那样可以使用反复运算算法,只使用常量空间实现所有这些遍历。然而,指向父结点的指针占用更多的空间。这只在需要指向父节点的指针或栈空间有限时才使用。例如,这是一个中序遍历的反复运算算法:

visit(root)    prev    := null    current := root    next    := null        while current != null        if prev == current.parent            prev := current            next := current.left        if next == null or prev == current.left            print current.value            prev := current            next := current.right        if next == null or prev == current.right            prev := current            next := current.parent        current := next


和深度优先遍历不同,广度优先遍历会先访问离根节点最近的节点。二叉树的广度优先遍历又称按层次遍历。算法借助队列实现。

一般有序树可映射为二叉树,但反之未必成立。

n叉树转换为二叉树的方法:二叉树中结点x的左子结点为n叉树中结点x的左子结点;二叉树中结点x的右子结点为n叉树中结点x的第一个右边的同级结点y。

二叉树当且仅当根节点没有右子结点时可转换为n叉树。

例如,在左边的树中,A有6个子结点{B,C,D,E,F,G}。它能被转换成右边的二叉树。

将n叉树转换为二叉树的例子


树的二叉链表标记法(孩子兄弟标记法)是树和二叉树转换的介质。

 /* 樹的二叉鏈表(孩子—兄弟)存儲表示 */ typedef struct CSNode {   TElemType data;   struct CSNode *firstchild,*nextsibling; }CSNode,*CSTree;

基本操作

线索二叉树

线索二叉树(英语:threaded binary tree,保留遍历时结点在任一序列的前驱和后继的信息):若结点有左子树,则其lchild域指示其左孩子,否则令lchild域指示其前驱;若结点有右子树,则其rchild域指示其右孩子,否则令rchild指示其后继。还需在结点结构中增加两个标志域LTag和RTag。LTag=0时,lchild域指示结点的左孩子,LTag=1时,lchild域指示结点的前驱;RTag=0时,rchild域指示结点的右孩子,RTag=1时,rchild域指示结点的后继。以这种结点结构构成的二叉链表作为二叉树的存储结构,叫做线索链表,其中指向结点前驱和后继的指针叫做线索,加上线索的二叉树称为线索二叉树。对二叉树以某种次序遍历使其变为线索二叉树的过程叫做线索化。若对二叉树进行中序遍历,则所得的线索二叉树称为中序线索二叉树,线索链表称为为中序线索链表。线索二叉树是一种物理结构。Tbt1.jpg

在中序线索树找结点后继的规律是:若其右标志为1,则右链为线索,指示其后继,否则遍历其右子树时访问的第一个结点(右子树最左下的结点)为其后继;找结点前驱的规律是:若其左标志为1,则左链为线索,指示其前驱,否则遍历左子树时最后访问的一个结点(左子树中最右下的结点)为其前驱。
在后序线索树中找到结点的后继分三种情况:

二叉树的二叉线索存储表示:在线索链表上添加一个头结点,并令其lchild域的指针指向二叉树的根结点,其rchild域的指针指向中序遍历时访问的最后一个结点。令二叉树中序序列中的第一个结点的lchild域指针和最后一个结点的rchild域的指针均指向头结点,这样就创建了一个双向线索链表。二叉树常采用二叉链表方式存储。

相关

  • 精准农业精准农业(precision agriculture)又称精准农作(precision farming)或者是定点作物管理(Site-specific crop management)等是指利用现代信息技术进行精耕细作。精准农业研究的目标是
  • 慢食运动慢食运动(Slow Food)是由意大利人卡尔洛·佩特里尼提出,目的是对抗日益盛行的快餐。运动提倡维持单个生态区的饮食文化,使用与之相关的蔬果、促进当地饲养业及农业。亦是慢生活
  • 沸水反应堆沸水反应堆(英语:boiling water reactor, BWR)是一种用来发电的轻水反应堆。沸水反应堆是第二常见的核能发电反应堆型式,在五十年代中期由爱达荷国家实验室(Idaho National Labor
  • 邻苯二甲酸单甲酯邻苯二甲酸单甲酯(英语:monomethyl phthalate,缩写MMP,或称为2-甲氧羰基苯甲酸,2-carbomethoxybenzoic acid)是一种邻苯二甲酸酯,可由邻苯二甲酸二甲酯水解而来,可刺激眼睛和皮肤,有
  • 媒体森林媒体森林(英语:Media Forest)是以色列的一个音乐产业服务提供商,于2005年在以色列内坦亚建立。法国、阿根廷、摩尔多瓦、比利时、保加利亚、罗马尼亚、希腊和瑞士均拥有公司的加
  • 钻石投资钻石投资是一种新兴的投资渠道。随着股票市场、住宅市场的低迷和黄金市场的持续震荡,钻石投资成为更受关注的投资方式。钻石又称金刚石,是由碳原子构成的晶体,为目前已知自然界
  • 青金岩青金岩(英文:Lapis lazuli,来源于拉丁语),又称为青金石,是一种较为罕有的宝石,为变质岩的一种。在阿富汗的巴达赫尚,发掘青金石的历史已经超过6,000年。在古埃及前王朝时期遗址亦可
  • 德国联邦铁路111型电力机车德国联邦铁路111型电力机车(德语:DB-Baureihe 111)是德国联邦铁路(1994年后为德国铁路)使用的一款四轴电力机车型号,在1974年至1984年期间共计生产了227台。其使用范围如今主要集
  • 安齐拉纳纳二区安齐拉纳纳二区(马达加斯加语:Antsiranana II),是马达加斯加的行政区,位于该国北部,由第亚那区负责管辖,首府设于北阿尼武拉努,面积6,025平方公里,2011年人口99,885,人口密度每平方公
  • 点 (附加符号)重音符号 短音符( ˘ ) 抑扬符 / 倒折音符 / ( ˇ ) 软音符( ¸ ) 扬抑符 / 折音符( ˆ ) 曲音符 / 分音符( ¨ ) 点( · ) 上钩符(  ̉ ) 触角(  ̛ ) 长音符( ˉ ) 反尾形符( ˛ ) 上圆圈( ˚