实习二 【唯一的确定一颗二叉树】.docVIP

  • 37
  • 0
  • 约4.08千字
  • 约 11页
  • 2017-12-31 发布于重庆
  • 举报
实习二 【唯一的确定一颗二叉树】

实习二 1.需求分析: 【问题描述】:如果给出了遍历二叉树的前序序列和中序序列,则可以构造出唯一的二叉树。试编写实现上述功能的程序。 【基本要求】:已知一颗二叉树的前序和中序序列,试设计完成下列任务的一个算法。 (1)构造一颗二叉树。 (2)证明构造正确(即分别以前序和中序遍历该树,将得到的结果与给出的序列进行比较)。 (3)对该二叉树进行后序遍历,输出后续遍历序列。 (4)用凹入法输出该二叉树。 【开发环境】: 系统:windows7 编程软件:VC++6.0 2.设计: 给定二叉树结点的前序序列和中序序列,可以唯一确定该二叉树。因为前序序列的第一个元素是根结点,该元素将二叉树中序序列分成两部分,左边(设l个元素)表示左子树,若左边无元素,则说明左子树为空;右边(设r个元素)是右子树,若为空,则右子树为空。根据前序遍历中“根—左子树—右子树”的顺序,则由从第二元素开始的l个结点序列和中序序列根左边的l个结点构成左子树,由前序序列最后r个元素序列与中序序列根右边的r个元素序列构造右子树。 假设一棵二叉树中结点的个数为n, 即该棵二叉树的前序遍历序列为q1, q2, q3, ?, qn , 中序遍历序列为z 1, z 2, z 3, ?, z n , 用数学归纳法证明由这两个序列能够唯一地确定一棵二叉树B t.当n= 1 时, 即前序遍历序列和中序遍历序列均只有一个元素, 且相同, 即为树的根, 由此唯一地确定了一棵二叉树。现在假设n m - 1 时命题成立, 则需要证明当n= m 时亦成立。当n= m 时, 前序序列为q1, q2, q3, ?, qm , 中序序列为z 1, z 2, z 3, ?, zm. 因为前序序列由前序遍历二叉树所得, 则q1必为根结点这个元素; 又中序序列由中序遍历二叉树所得, 则在中序序列中必能找到和q1相同的元素, 设为z j , 由此{z 1, z 2, ?, z j - 1} 为左子树的中序序列, {z j+ 1, z j+ 2, ?, zm } 为右子树的中序序列。若j= 1, 即z 1 为根, 此时二叉树的左子树为空, {q2, q3, ?, qm }为左子树的前序序列, {z 2, z 3, ?, zm }为右子树的中序序列。右子树的结点数为m - 1, 根据假设, 这两个序列唯一确定了一棵右子树。因此,唯一确定的一棵二叉树是由z 1 为根, 该棵右子树为右子树(唯一确定的这棵二叉树无左子树) 来构成。若j= m , 即zm 为根, 此时二叉树的右子树为空, {q1, q2, ?, qm - 1} 为左子树的前序序列, {z 1, z 2, ?,zm - 1} 为左子树的中序序列。 左子树的结点数为m - 1, 根据假设, 这两个序列唯一地确定了一棵左子树。因此, 唯一确定的一棵二叉树是由zm 为根, 该棵左子树为左子树(唯一确定的这棵二叉树无右子树) 来构成。若2 j m - 1, 则子序列{q1, q2, ?,qj - 1 } 和{z 1, z 2, ?, z j - 1} 根据假设可知, 它们唯一地确定了一棵左子树。 同理, 子序列{qj+ 1, qj+ 2,?, qm } 和{z j+ 1, z j+ 2 , ?, zm } 唯一地确定了一棵右子树。 前者确定的左子树与后者确定的右子树及z j可唯一地确定一棵二叉树。 由此, 从理论上证明了由一棵二叉树的前序遍历序列和中序遍历序列能够唯一确定一棵二叉树。 同理, 即由一棵二叉树的后序遍历序列和中序遍历序列, 也能够唯一地确定一棵二叉树。 具体思想 例如: 前序序列为ABDEGCFHIJ, 中序遍历为DBGEAHFIJC 由前序遍历可确定根为A 中序遍历可得A的左右子树分别包含结点有DE、A的左子树分别包含结点有DE,由前序遍历可知B为根结点,B的左右子树分别包含结点有D、 结构体定义: typedef struct Node { DataType data; struct Node *leftChild;//左指数指针 struct Node *rightChild;//右指数指针 }BiTreeNode;//结点的结构体定义 6.源代码 ……………………………….BiTree.h…………………………………………….. typedef struct Node { DataType data; struct Node *leftChild;//左指数指针 struct Node *rightChild;//右指数指针 }BiTreeNode;//结点的结构体定义 void Initiate(BiTreeNode **root)//初始化创建二叉树的头结点 { if(((*roo

文档评论(0)

1亿VIP精品文档

相关文档