二叉树

✍ dations ◷ 2025-12-05 16:49:34 #自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域的指针均指向头结点,这样就创建了一个双向线索链表。二叉树常采用二叉链表方式存储。

相关

  • 马哈拉施特拉马哈拉施特拉邦(马拉提语:महाराष्ट्र,印地语:महाराष्ट्र,拉丁字母转写:mahārāṣṭra),位于印度中部,西邻阿拉伯海,与印度卡纳塔克邦、特伦甘纳邦、果阿邦、古吉
  • 联盟90/绿党联盟90/绿党(德语:Bündnis 90/Die Grünen, GRÜNE),是德国中间偏左的环境保护主义政党,亦是全球最早的绿色政治组织,提倡绿色政治,反对扩军,主张和平、反核能,主张回归自然的生活方
  • 福克斯通镇坐标:51°04′52″N 1°09′58″E / 51.081°N 1.166°E / 51.081; 1.166福克斯通,(英语:Folkestone),英格兰肯特郡的一个城市,人口53,411, 距法国加来港仅有40公里的航程,几百年来一
  • 1s2 2s2 2p62, 8蒸气压第一:2080.7 kJ·mol−1 第二:3952.3 kJ·mol−1 第三:6122 kJ·mol−1 (主条目:氖的同位素氖(旧译作氝,讹作氞)是一种化学元素,它的化学符号是Ne,它的原子
  • 狮门桥加拿大不列颠哥伦比亚省大温哥华地区 南端:温哥华 北端:狮门桥(Lions' Gate Bridge)是加拿大不列颠哥伦比亚省内一条悬索吊桥,横越布勒内湾的第一海峡,连接温哥华市中心及北岸市
  • 苏禄苏禄群岛(Sulu Archipelago),菲律宾西南部岛群。自民答那峨三宝颜半岛向西延伸至加里曼丹岛东岸,与马来西亚沙巴州相望,有800个以上小岛组成,分为五个岛群,面积2823平方公里,大岛都
  • 北京大学山鹰社北京大学山鹰社成立于1989年4月1日,是中国首家以登山、攀岩为主要活动的学生社团。社团以走向自然、征服自我、不畏艰难、勇于进取、追求卓越为宗旨。社训:存鹰之心于高远,取鹰
  • 莉姆·阿布达拉赞莉姆·阿布达拉赞(Reem Abdalazem,1992年11月25日-)是一名埃及花样游泳运动员。她代表埃及参加奥林匹克运动会和世界游泳锦标赛。
  • 玉螺科玉螺科(学名:Naticidae)是一个微小到大型捕食性海螺的一个科,都是玉黍螺类支序的海洋腹足纲软体动物。本科物种的螺壳大多呈球体状(包括有:圆球形、卵球形及耳形)。其物种可食用。
  • 吕俊雄吕俊雄(1973年12月7日-)为台湾的棒球选手之一,曾经效力于中华职棒中信鲸队,守备位置为外野手。5 余进德 | 6 石志伟 | 11 蒋智聪 | 20 吕俊雄 | 25 飞锐 | 30 黄龙义 | 31 林智胜