正在加载图片...
2.试写出从二叉树中删除一个接点,使该二叉树仍未为叉树的算法。 实现提示]本题要注意的事,删除二叉树中的结点与删除一棵树中的结点不同,二叉树 的结点对应的是一条纪录,只要在删除它后仍使它为二叉排序即可:而要将一棵树中的 结点删除,是将该结点同他的左右子树一并删除 要将二叉树的结点删除,必须建立一棵二叉树,以二叉排序方式表示,然后 再进行二叉树结点删除,依据删除结点位置又可分为根和非跟结点两种,可将算法描述 为 (1)若被删除结点k为二叉树的根结点,则 a:若k有左子树l而无右子树,则将仅需I作为根结点即可 b:若k有右子树r而无左子树,则将仅需r作为根结点即可 c:若k有左子树I而又有右子树r,则将1作为根结点此时若l无右子树 需将的1右孩子指针指向r;若有右子树则需沿着1右分支一直往下检索 直到找到最右的且没有右子树的结点为止,即最右下的一个结点,然后把 该结点的右孩子指针指向r (2)若被删除的结点不是二叉树的根结点,此时可设*p为k的双亲结点,k是 *p的左子树活右子树,处理: a:若k有左子树1,而无右子树,则应将肀结点的左指针或右指针改指向 若k无左子树1,而有右子树,则应将◆p结点的左指针或右指针改指向 c:若k有左子树l,又有右子树,则应将◆p结点的左指针或右指针改指向 l,此时若1无右子树,需将的1右孩子指针指向r:若1有右子树则需沿着 l右分支一直往下检索,直到找到最右的且没有右子树的结点为止,即最右 下的一个结点,然后把该结点的右孩子指针指向r 设t为二叉排序树的根指针,而叉排序数一二叉链表储存,k为待删除结点 的关键字,则可的程序如下: 算法实现]首先建立一个二叉树,一二叉链表方式表示 typedef struct node ∥关键字项 struct node lchild. *rchild void inorder(t)∥/中序遍历二叉树 bitree *t norder(t->lchild)2.试写出从二叉树中删除一个接点,使该二叉树仍未为叉树的算法。 [实现提示]本题要注意的事,删除二叉树中的结点与删除一棵树中的结点不同,二叉树 的结点对应的是一条纪录,只要在删除它后仍使它为二叉排序即可;而要将一棵树中的 结点删除,是将该结点同他的左右子树一并删除。 要将二叉树的结点删除,必须建立一棵二叉树,以二叉排序方式表示,然后 再进行二叉树结点删除,依据删除结点位置又可分为根和非跟结点两种,可将算法描述 为: (1) 若被删除结点 k 为二叉树的根结点,则: a:若 k 有左子树 l 而无右子树,则将仅需 l 作为根结点即可 b: 若 k 有右子树 r 而无左子树,则将仅需 r 作为根结点即可 c: 若 k 有左子树 l 而又有右子树 r ,则将 l 作为根结点,此时若 l 无右子树, 需将的 l 右孩子指针指向 r;若 l 有右子树则需沿着 l 右分支一直往下检索, 直到找到最右的且没有右子树的结点为止,即最右下的一个结点,然后把 该结点的右孩子指针指向 r。 (2) 若被删除的结点不是二叉树的根结点,此时可设*p 为 k 的双亲结点,k 是 *p 的左子树活右子树,处理: a:若 k 有左子树 l,而无右子树,则应将*p 结点的左指针或右指针改指向 l; b; 若 k 无左子树 l,而有右子树,则应将*p 结点的左指针或右指针改指向 r c: 若 k 有左子树 l,又有右子树,则应将*p 结点的左指针或右指针改指向 l,此时若 l 无右子树,需将的 l 右孩子指针指向 r;若 l 有右子树则需沿着 l 右分支一直往下检索,直到找到最右的且没有右子树的结点为止,即最右 下的一个结点,然后把该结点的右孩子指针指向 r。 设 t 为二叉排序树的根指针,而叉排序数一二叉链表储存,k 为待删除结点 的关键字,则可的程序如下: [算法实现]首先建立一个二叉树,一二叉链表方式表示 typedef struct node { int key; //关键字项 struct node * lchild, *rchild; }bitree; void inorder(t)//中序遍历二叉树 bitree *t; { if(t!=null) { inorder(t->lchild);
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有