精华内容
下载资源
问答
  • 线索二叉树的运算 1.查找某结点*p在指定次序下的前趋和后继结点 (1)在中序线索二叉树中,查找结点*p的中序后继结点  在中序线索二叉树中,查找结点*p的中序后继结点分两种情形: ①若*p的右子树空(即p->rtag...

    转自文库

     

    线索二叉树的运算

    1.查找某结点*p在指定次序下的前趋和后继结点
    (1)在中序线索二叉树中,查找结点*p的中序后继结点
      在中序线索二叉树中,查找结点*p的中序后继结点分两种情形:
    ①若*p的右子树空(即p->rtag为Thread),则p->rchild为右线索,直接指向*p的中序后继。
      【例】下图的中序线索二叉树中,结点D的中序后继是A。


           
    ②若*p的右子树非空(即p->rtag为Link),则*p的中序后继必是其右子树中第一个中序遍历到的结点。也就是从*p的右孩子开始,沿该孩子的左链往下查找,直至找到一个没有左孩子的结点为止,该结点是*p的右子树中"最左下"的结点,即*P的中序后继结点。
      【例】上图的中序线索二叉树中:
    A的中序后继是F,它有右孩子;
    F的中序后继是H,它无右孩子;
    B的中序后继是D,它是B的右孩子。  
      在中序线索二叉树中求中序后继结点的过程可【参见动画演示】,具体算法如下:

    BinThrNode*InorderSuccessor(BinThrNode *p)
          {//在中序线索树中找结点*p的中序后继,设p非空
             BinThrNode *q;
             if (p->rtag==Thread) //*p的右子树为空
                  Return p->rchild; //返回右线索所指的中序后继
             else{
                  q=p->rchild;//从*p的右孩子开始查找
                  while (q->ltag==Link)
                       q=q->lchild;//左子树非空时,沿左链往下查找
                  return q;//当q的左子树为空时,它就是最左下结点
                 }//end if
          }


        该算法的时间复杂度不超过树的高度h,即O(h)。

     

    (2)在中序线索二叉树中查找结点*p的中序前趋结点
      中序是一种对称序,故在中序线索二叉树中查找结点*p的中序前趋结点与找中序后继结点的方法完全对称。具体情形如下:
    ①若*p的左子树为空,则p->1child为左线索,直接指向*p的中序前趋结点;
      【例】上图所示的中序线索二叉树中,F结点的中序前趋结点是A
    ②若*p的左子树非空,则从*p的左孩子出发,沿右指针链往下查找,直到找到一个没有右孩子的结点为止。该结点是*p的左子树中"最右下"的结点,它是*p的左子树中最后一个中序遍历到的结点,即*p的中序前趋结点。
      【例】上图所示中序线索二叉树中,结点E左子树非空,其中序前趋结点是I
      在中序线索二叉树中求中序前趋结点的过程可【参见动画演示】,具体算法如下:
       

    BinThrNode *Inorderpre(BinThrNode *p)
          {//在中序线索树中找结点*p的中序前趋,设p非空
             BinThrNode *q;
            if (p->ltag==Thread) //*p的左子树为空
                  return p->lchild; //返回左线索所指的中序前趋
             else{
                  q=p->lchild;//从*p的左孩子开始查找
                  while (q->rtag==Link)
                       q=q->rchild;//右子树非空时,沿右链往下查找
                  return q;//当q的右子树为空时,它就是最右下结点
                 }//end if
          }


      由上述讨论可知:对于非线索二叉树,仅从*p出发无法找到其中序前趋(或中序后继),而必须从根结点开始中序遍历,才能找到*p的中序前趋(或中序后继)。线索二叉树中的线索使得查找中序前趋和中序后继变得简单有效。

     

    (3)在后序线索二叉树中,查找指定结点*p的后序前趋结点
      在后序线索二叉树中,查找指定结点*p的后序前趋结点的具体规律是:
    ①若*p的左子树为空,则p->lchild是前趋线索,指示其后序前趋结点。
       【例】在下图所示的后序线索二叉树中,H的后序前趋是B,F的后序前趋是C。

     

    ②若*p的左子树非空,则p->lchild不是前趋线索。由于后序遍历时,根是在遍历其左右子树之后被访问的,故*p的后序前趋必是两子树中最后一个遍历结点。
      当*p的右子树非空时,*p的右孩子必是其后序前趋
      【例】在上图所示的后序线索二叉树中,A的后序前趋是E;
      当*p无右子树时,*p的后序前趋必是其左孩子
      【例】在上图所示的后序线索二叉树中,E的后序前趋是F

     

    (4)在后序线索二叉树中,查找指定结点*p的后序后继结点
      具体的规律:
    ①若*p是根,则*p是该二叉树后序遍历过程中最后一个访问到的结点。*p的后序后继为空
    ②若*p是其双亲的右孩子,则*p的后序后继结点就是其双亲结点
      【例】上图所示的后序线索二叉树中,E的后序后继是A。
    ③若*p是其双亲的左孩子,但*P无右兄弟,*p的后序后继结点是其双亲结点
      【例】上图所示的后序线索二叉树中,F的后序后继是E。
    ④若*p是其双亲的左孩子,但*p有右兄弟,则*p的后序后继是其双亲的右子树中第一个后序遍历到的结点,它是该子树中"最左下的叶结点"
      【例】上图所示的后序线索二叉树中,B的后序后继是双亲A的右子树中最左下的叶结点H
     

    注意:
    F是孩子树中"最左下"结点,但它不是叶子。
      由上述讨论中可知:在后序线索树中,仅从*p出发就能找到其后序前趋结点;要找*p的后序后继结点,仅当*p的右子树为空时,才能直接由*p的右线索p->rchild得到。否则必须知道*p的双亲结点才能找到其后序后继。因此,如果线索二叉树中的结点没有指向其双亲结点的指针,就可能要从根开始进行后序遍历才能找到结点*P的后序后继。由此,线索对查找指定结点的后序后继并无多大帮助

    展开全文
  • 二、中序线索二叉树中找中序前驱 三、先序线索二叉树找先序后继 四、先序线索二叉树找先序前驱 五、后序线索二叉树找后序前驱 六、后序线索二叉树找后序后继 七、总结 一、中序线索二叉树找中序后继 在中序...

    目录

    一、中序线索二叉树找中序后继

    二、中序线索二叉树中找中序前驱

    三、先序线索二叉树找先序后继

    四、先序线索二叉树找先序前驱

    五、后序线索二叉树找后序前驱

    六、后序线索二叉树找后序后继

    七、总结

    一、中序线索二叉树找中序后继

    在中序线索二叉树中找到指定结点*p的中序后继next

    ①若p->rtag == 1,则next = p->rchild

    ②若p->rtag == 0

    //找到以P为跟的子树中,第一个被中序遍历的结点
    ThreadNode *Firstnode(ThreadNode *p){
        //循环找到最左下结点(不一定是叶子结点)
        while(p->ltag == 0)
            p = p->lchild;
        return p;
    }
    
    //在中序线索二叉树中找到结点p的后继结点
    ThreadNode *Nextnode(ThreadNode *p){
        //右子树中最左下结点
        if(p->rtag == 0)
            return Firstnode(p->rchild);
        else
            return p->rchild;
    }
    
    //对中序线索二叉树进行中序遍历(利用线索实现的非递归算法)  空间复杂度O(1)
    void Inorder(ThreadNode *T){
        for(ThreadNode *p = Firstnode(T);p != NULL; p = Nextnode(p))
            visit(p);
    }

    二、中序线索二叉树中找中序前驱

    在中序线索二叉树中找到指定结点*p的中序前驱pre

    ①若p->ltag == 1,则pre = p->lchild

    ②若p->ltag == 0

    //找到以P为跟的子树中,最后一个被中序遍历的结点
    ThreadNode *Lastnode(ThreadNode *p){
        //循环找到最右下结点(不一定是叶子结点)
        while(p->rtag == 0)
            p = p->rchild;
        return p;
    }
    
    //在中序线索二叉树中找到结点p的前驱结点
    ThreadNode *Prenode(ThreadNode *p){
        //左子树中最右下结点
        if(p->ltag == 0)
            return Lastnode(p->lchild);
        else
            return p->lchild;
    }
    
    //对中序线索二叉树进行中序遍历(利用线索实现的非递归算法)  空间复杂度O(1)
    void RevInorder(ThreadNode *T){
        for(ThreadNode *p = Lastnode(T);p != NULL; p = Prenode(p))
            visit(p);
    }

    三、先序线索二叉树找先序后继

    在先序线索二叉树中找到指定结点*p的先序后继next

    ①若p->rtag == 1,则next = p->rchild

    ②若p->rtag == 0

    四、先序线索二叉树找先序前驱

    在先序线索二叉树中找到指定结点*p的先序前驱pre

    ①若p->ltag == 1,则next = p->lchild

    ② 若p->ltag = 0

    前提:改用三叉链表可以找到父节点

    ①如果能找到p的父节点,且p是左孩子

    ②如果能找到p的父节点,且p是右孩子,其左兄弟为空

    ③如果能找到p的父节点,且p是右孩子,其左兄弟非空

    ④如果p是根结点,则p没有先序前驱

    五、后序线索二叉树找后序前驱

    在后序线索二叉树中找到指定结点*p的后序前驱pre

    ①若p->ltag == 1,则pre = p->lchild

    ②若p->ltag == 0

    六、后序线索二叉树找后序后继

    在后序线索二叉树中找到指定结点*p的后序后继next

    ①若p->rtag == 1,则next = p->rchild

    ②若p->rtag == 0

    前提:改用三叉链表可以找到父节点

    ①如果能找到p的父节点,且p是右孩子

    ②如果能找到p的父节点,且p是左孩子,且右兄弟为空

    ③如果能找到p的父节点,且p是左孩子,且右兄弟非空

    ④如果p是根节点,则p没有后序后继

    七、总结

    展开全文
  • 前驱节点,指是以中序遍历,遍历二叉树,某一个节点前一个节点,被称为其前驱节点。 也就是,某一节点左子树右子节点右子节点右节点。。。 特殊情况,如果是二叉搜索树,则前驱节点是按从小到大顺序,...

    前驱节点

    何为前驱节点?
    前驱节点,指的是以中序遍历,遍历二叉树,某一个节点的前一个节点,被称为其前驱节点。
    也就是,某一节点的左子树的右子节点的右子节点的右节点。。。

    特殊情况,如果是二叉搜索树,则前驱节点是按从小到大的顺序,比其前面一个节点。

    思路:

    如果node.left != null;
    则循环,node.left.right.right.right…直至为空,则找到了其前驱节点。

    如果node.left == null;
    如果node.parent == null;则没有前驱
    如果node.parent != null;则前驱节点为node.parent.parent.parent…;
    终止条件:node在parent的右子树中

    public static TreeNode preNode(TreeNode root)
    	{
    		if(root == null) return null;
    		
    		TreeNode node = root.left;
    		
    		if(node != null) {
    			while(node.right != null) {
    				node = node.right;
    			}
    			return node;
    		}else {
    			while(node.parent != null && node == node.parent.left) {
    				node = node.parent;
    			}
    			//来到这里包含两种情况:
    			//node.parent == null
    			//node = node.parent.right
    			
    			return node.parent;
    		}
    	}
    	
    

    后继节点

    中序遍历的某一节点的后一个节点,被称为后继节点
    参照前驱节点,不难写成后继节点

    思路:

    如果node.right != null;
    则循环,node.right.left.left.left…直至为空,则找到了其后继节点。

    如果node.right == null;
    如果node.parent == null;则没有后继
    如果node.parent != null;则后继节点为node.parent.parent.parent…;
    终止条件:node在parent的左子树中

    public static TreeNode postNode(TreeNode root) {
    		if(root == null) return null;
    		
    		TreeNode node = root.right;
    		if(node != null) {
    			while(node.left != null)
    			{
    				node = node.left;
    			}
    			return node;
    		}else {
    			while(node.parent != null && node == node.parent.right)
    			{
    				node = node.parent;
    			}
    			
    			return node.parent;
    		}
    	}
    
    展开全文
  • 这里写自定义目录标题【带电工作重要性———-查找二叉树给定x结点指针位置(重)】新改变功能快捷键合理创建标题,有助于目录生成如何改变文本样式插入链接与图片如何插入一段漂亮代码片生成一个适合...

    【带电工作的重要性———-查找二叉树给定x的结点指针位置(重)】

    void insert::bitree(binodebt elemtype x)
    //声明为遍历函数,遍历访问二叉树,头节点的头指针为
    bt,变量x的值已知

    p=binode*bt //假设p指针等于二叉树的根结点指针/
    if (bitreenull)
    return;//树为空,则x不存在返回。
    else if (p->data
    x)
    return p;//根结点的值等于x。返回p。
    else

    while(p->data!=x&&ltag0)
    p=leftchild;//递归遍历左子树求x位置。
    while(p-data!=x&&rtag
    0)
    P=rightchild;//递归遍历右子树求x位置。

    return p;

    算法描述

    你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

    新的改变

    我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

    1. 全新的界面设计 ,将会带来全新的写作体验;
    2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
    3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
    4. 全新的 KaTeX数学公式 语法;
    5. 增加了支持甘特图的mermaid语法1 功能;
    6. 增加了 多屏幕编辑 Markdown文章功能;
    7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
    8. 增加了 检查列表 功能。

    功能快捷键

    撤销:Ctrl/Command + Z
    重做:Ctrl/Command + Y
    加粗:Ctrl/Command + B
    斜体:Ctrl/Command + I
    标题:Ctrl/Command + Shift + H
    无序列表:Ctrl/Command + Shift + U
    有序列表:Ctrl/Command + Shift + O
    检查列表:Ctrl/Command + Shift + C
    插入代码:Ctrl/Command + Shift + K
    插入链接:Ctrl/Command + Shift + L
    插入图片:Ctrl/Command + Shift + G
    查找:Ctrl/Command + F
    替换:Ctrl/Command + G

    合理的创建标题,有助于目录的生成

    直接输入1次#,并按下space后,将生成1级标题。
    输入2次#,并按下space后,将生成2级标题。
    以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

    如何改变文本的样式

    强调文本 强调文本

    加粗文本 加粗文本

    标记文本

    删除文本

    引用文本

    H2O is是液体。

    210 运算结果是 1024.

    插入链接与图片

    链接: link.

    图片: Alt

    带尺寸的图片: Alt

    居中的图片: Alt

    居中并且带尺寸的图片: Alt

    当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

    如何插入一段漂亮的代码片

    博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

    // An highlighted block
    var foo = 'bar';
    

    生成一个适合你的列表

    • 项目
      • 项目
        • 项目
    1. 项目1
    2. 项目2
    3. 项目3
    • 计划任务
    • 完成任务

    创建一个表格

    一个简单的表格是这么创建的:

    项目 Value
    电脑 $1600
    手机 $12
    导管 $1

    设定内容居中、居左、居右

    使用:---------:居中
    使用:----------居左
    使用----------:居右

    第一列 第二列 第三列
    第一列文本居中 第二列文本居右 第三列文本居左

    SmartyPants

    SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

    TYPE ASCII HTML
    Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
    Quotes "Isn't this fun?" “Isn’t this fun?”
    Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

    创建一个自定义列表

    Markdown
    Text-to-HTML conversion tool
    Authors
    John
    Luke

    如何创建一个注脚

    一个具有注脚的文本。2

    注释也是必不可少的

    Markdown将文本转换为 HTML

    KaTeX数学公式

    您可以使用渲染LaTeX数学表达式 KaTeX:

    Gamma公式展示 Γ(n)=(n1)!nN\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通过欧拉积分

    Γ(z)=0tz1etdt. \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

    你可以找到更多关于的信息 LaTeX 数学表达式here.

    新的甘特图功能,丰富你的文章

    Mon 06Mon 13Mon 20已完成 进行中 计划一 计划二 现有任务Adding GANTT diagram functionality to mermaid
    • 关于 甘特图 语法,参考 这儿,

    UML 图表

    可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

    张三李四王五你好!李四, 最近怎么样?你最近怎么样,王五?我很好,谢谢!我很好,谢谢!李四想了很长时间, 文字太长了不适合放在一行.打量着王五...很好... 王五, 你怎么样?张三李四王五

    这将产生一个流程图。:

    链接
    长方形
    圆角长方形
    菱形
    • 关于 Mermaid 语法,参考 这儿,

    FLowchart流程图

    我们依旧会支持flowchart的流程图:

    Created with Raphaël 2.2.0开始我的操作确认?结束yesno
    • 关于 Flowchart流程图 语法,参考 这儿.

    导出与导入

    导出

    如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

    导入

    如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
    继续你的创作。


    1. mermaid语法说明 ↩︎

    2. 注脚的解释 ↩︎

    展开全文
  • 1.二叉树遍历 先序遍历(DLR) 遍历顺序:根节点-》左子树-》右子树 中序遍历(LDR) 遍历顺序:左子树-》根节点-》右子树 ...使用理由:二叉链表不能够直接得到结点在遍历序列中的前驱和后继信息
  • Java 数据结构 二叉树

    2019-04-10 01:43:36
    与前面所介绍循序表以及链表结构所不同,树结构是一种描述非线性层次关系的数据结构。 其主要有一下几个特点: 在一个树结构中,有且仅有一个结点没有直接前驱,那这个结点就是树根结点 除了根结点外,其余结点...
  • java 数据结构 二叉树

    2014-07-21 19:42:03
    树是一种特殊非线性的数据结构二叉树是一种特殊树,每个节点最多有两个孩子,称为“左孩子”和“右孩子”。 树结构特点:它每一个节点可以有不止一个直接后继节点,除根以外每个节点都只有一个前驱结点...
  • 提示:文章写完后,目录可以自动生成...当以二叉链表作为存储结构时,只存储了结点的左右孩子信息,而没有存储结点在遍历序列中的前驱和后继信息。而要想获得这样的信息有两种方法:①遍历二叉树。在遍历过程中可得到..
  • Java数据结构 二叉树

    2021-03-30 16:37:51
    树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系集合。把它叫做树,是因为它看起来像一棵倒挂树,也就是说它是根朝上,而叶朝下 特点: 有一个特殊节点,称为根节点,根节点...
  • 线索二叉树怎么充分利用了剩余结点呢?把剩余结点记录前驱后继,有什么效果呢? 课本上说,把树形逻辑变为线性逻辑,这一点如何体现呢?
  • 查找线索二叉树的前驱和后继

    千次阅读 2017-04-15 15:34:18
    看书一直没想明白、、、二叉树即使有线索了,对于左右子树都非空的二叉树,从后继怎么找到的前驱啊,找不到啊。啊。啊。(中序的) 搜了个代码看看,果然清晰透彻,浑身酥爽。【自从上次看懂KMP算法时,体验到...
  • 数据结构二叉树

    2018-06-29 11:13:00
    ●线索二叉树:结点中加入一个前驱和后继. 树存储:双亲法(因为每个节点只有一个父节点,所以只存一个parent即可),孩子法,孩子兄弟法 ●有序查找:2分,斐波那契查找.斐波那契法:比如表里面有20个元素.斐波那契数列是...
  • 2020/3/13 本节内容 线索二叉树前驱/后继 王道考研/ 1 知识总览 王道考研/ 2 王道考研/ 1 2020/3/13 中序线索二叉树找中序后继 A 在中序线索二叉树中找到指定结点*p 中序后继next 5 B C 若p->rtag==1则next = p...
  • 二叉树的后继节点 什么是二叉树的后继节点呢? 就是这颗二叉树中序遍历顺序中,当前节点的下一个节点称为这个当前节点的后继节点。 与之相反的是前驱节点,前驱节点,就是二叉树中序遍历的顺序中,当前节点的上一...
  • 前驱节点:二叉树中序遍历完成后和这个节点相邻的前面的节点为该节点的前驱节点 后继节点:二叉树中序遍历完成后和这个节点相邻的后面的节点为该节点的后继节点 ...正常的二叉树的数据结构: struct node {...
  • 上一篇博客介绍了线索二叉树的构造,以及简单的递归输出方法 https://blog.csdn.net/hpu2022/article/details/107234190 阅读本文可以先大致了解一下上一篇文章 线索二叉树定义 typedef struct ThreadNode{ ...
  • 上图所示二叉链表,存在多个...可以在这n+1个空指针域中保存结点(以先序、中序或后序遍历前驱和后继指针,这样在下次遍历时,可以大大提高速度。将所有空指针域中rchild指向它后继。 将所有空指针域中...
  • 二叉树的线索化就是对利用二叉树指向空的指针节点加以利用,以实现能快速找到二叉树的直接前驱和直接后继 使其指空的左孩子指针指向其前驱 使其指空的有孩子节点指向其后继 对于不同的遍历顺序线索化的方式都是相同...
  • 第5章 树和二叉树 Tree & Binary Tree 特点非线性结构一个直接前驱但可能有多个直接后继一对多或1:n5.1 树概述5.2 二叉树定义和性质5.3 遍历二叉树5.4 线索二叉树5.5 树和森林5.6 哈夫曼及其应用5.1 树基本概念1...
  • 若结点p左右子女均无,设其中序左线索指向某祖先结点f(p是f右子树中按中序遍历的第一个结点),若f有左子女,则其左子女是结点p在后序下的前驱;若f无左子女,则顺其前驱找双亲的双亲,一直继续到双亲有左子女...
  • 每个结点有唯一的前驱结点,有一个或多个后继结点。(nnn个节点有n−1n-1n−1条边) 基本术语: 度:结点的子结点的个数; 树的度:树种最大的度数; 分支结点:度大于000的结点; 叶子结点:度为000的结点; 结点...
  • 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系集合。把它叫做树是因为它看起来像一棵倒挂树,也就是说它是根朝上,而叶朝下。 有一个特殊结点,称为根结点,根节点没有前驱...
  • 数据结构 线索二叉树

    2018-07-15 18:23:25
    指向前驱和后继的指针称为线索,相应的二叉树就是线索二叉树这里的前驱和后继是指在经过某一种遍历(先序遍历,中序遍历,后序遍历)后得到的顺序如先序遍历后得到ASBCDJF,则S的前驱是A,S的后继是B...
  • 数据结构二叉树

    2020-08-31 10:37:34
    相关术语 节点:数分支或者边缘结合部 叶子节点:树最边缘部分,没有...2.树简化形式 ==》二叉树 性质:除过必须有树本身性质外,还有如下特性。 二叉树必须有左右子树之分: 定义: 1、有限集合 2、互
  • 线索二叉树  指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树 lchild ...线索化:二叉树以某种次序遍历使其变为线索二叉树的过程称为线索化,实质:
  • 二叉树的节点的最大度为2。 深度:数的层数,根节点为第一层,依次类推。叶子节点:度为0的节点,即没有子节点的节点。 2 树:树中的每一个节点,可以有n(后续节点)个子节点,但是每个节点只有一个前驱节点。 3 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 787
精华内容 314
关键字:

数据结构二叉树的前驱

数据结构 订阅