但是在现实应用,一些问题的数据元素之间的关系就不这.pptVIP

  • 1
  • 0
  • 约2.32万字
  • 约 158页
  • 2019-01-24 发布于江苏
  • 举报

但是在现实应用,一些问题的数据元素之间的关系就不这.ppt

但是在现实应用,一些问题的数据元素之间的关系就不这

§6.5 线索二叉树 特点:空间利用率高,但线索不完全; 举例: a b c d e f g h a 0 0 b 0 0 c 0 0 d 0 0 e 0 0 f 0 0 g 0 0 h 0 0 1 1 1 1 1 1 1 1 1 中序遍历序列:dbegafhc 0 0 1 一、线索方法 §6.5 线索二叉树 二、线索的使用 假设已经建立了某种遍历的线索,那么,在再按同样遍历方式 遍历时,就可以直接使用线索信息得到遍历序列,遍历就是找前驱 或后继,从而提高了效率,若每个结点都记录了前驱、后继线 索,这是很方便的!! 但是,很遗憾,我们的线索方法是记录的不完全线索(为了 节省空间),增加了找前驱、后继的难度,因为有些结点根本没有 记录线索或仅仅记录了一部分! 1、中序线索二叉树,找前趋、后继的方法 前驱: 假设p指向当前结点,找p所指结点的前驱、后继 若p-ltag=1,则p - lchild就是其前驱结点; 若p - ltag=0,则p - lchild指的是左儿子,前驱是谁? 根据中序遍历的规则,前驱在左子树上,而且是中序 遍历左子树的最后一个结点,即左子树的最右下结点。 p if(p - ltag==1) return(p - lson) else { q=p - lson; while(q - rson!=NULL) q=q - rson } rerturn(q) ; §6.5 线索二叉树 二、线索的使用 后继: 若p - rtag=1,则p - rson就是其后继结点; 若p - rtag=0,则p - rson指的是右儿子,后继是谁? 根据中序遍历的规则,后继在右子树上,而且是中序 遍历右子树的第一个结点,即右子树的最左下结点。 p if(p - rtag==1) return(p - rson) else { q=p - rson; while q - lson!=NULL) q=q-lson } rerturn(q) ; §6.5 线索二叉树 二、线索的使用 §6.5 线索二叉树 2、前序线索二叉树,找前趋、后继的方法 前驱: 假设p指向当前结点,找p所指结点的前驱、后继 若p - ltag=1,则p - lson就是其前驱结点; 若p - ltag=0,则p - lson指的是左儿子,前驱是谁? 根据前序遍历的规则,前趋不在左、右子树上,而 是与父亲有关。分几种情况: (1)P是根,则无前驱; P 二、线索的使用 §6.5 线索二叉树 (2)P是父亲的左儿子或是右儿子但无左兄弟, 前驱是父亲; p p 二、线索的使用 §6.5 线索二叉树 (3)P是父亲的右儿子,且有左兄弟,其前驱是前序 遍历父亲左子树上的最后一个结点(是最右下结 点吗?) p p 二、线索的使用 §6.5 线索二叉树 后继: 若p - rtag=1,则p - rson就是其后继结点; 若p - rtag=0,则p - rson指的是右儿子,后继是谁? 根据前序遍历的规则,后继在左、右子树上,如果p 有左子树,则后继是左子树的根,否则是右子树的根; p p 二、线索的使用 §6.5 线索二叉树 3、后序线索二叉树,找前趋、后继的方法 前驱: 假设p指向当前结点,找p所指结点的前驱、后继 若p - ltag=1,则p - lson就是其前驱结点; 若p - ltag=0,则p - lson指的是左儿子,前驱是谁? 根据后序遍历的规则,若p的右子树不空,则前驱 是右子树的根,否则是左子树的根; p p 二、线索的使用 §6.5 线索二叉树 后继: 若p - rtag=1,则p -rson就是其后继结点; 若p - rtag=0,则p - rson指的是右儿子,后继是谁? 根据后序遍历的规则,后继不在左、右子树上,而与 双亲有关。分几种情况: p (1)P是根,则无后继; (2)P是父亲的右儿子或是左儿子但无右兄弟, 后继是父亲; p 二、线索的使用 (3)P是父亲的左儿子,且有右兄弟,其后继驱是 后序遍历右子树上的第一个结点。(是最左 下结点吗?) p §6.5 线索二叉树 二、线索的使用 §6.5 线索二叉树 三、二叉树的线索化 方法: 在进行某种方式遍历的同时,把其中的空指针改为 记线索(左指针空时,指向前驱;右指针空时指向 后继)。 在此,仅介绍中序线索二叉树的算法实现,设为P为当前结点,pre为p的前驱结点,算法描述

文档评论(0)

1亿VIP精品文档

相关文档