中序线索化二叉树以及中序遍历线索化二叉树、倒中序遍历线索化二叉树
2017-10-07 18:48
459 查看
中序线索化二叉树的思想:按照中序的前驱后继关系,若p的左子树为空,则左子树指向p的中序前驱,若p的右子树为空,则p的右子树节点指向p的后继,若是子树都有,就不用捣腾了。第一个节点的左子树为空(此节点一定是叶节点,而且没前驱,所以是空),最后一个节点的右子树也是空。
测试代码
typedef char ElemType; typedef enum{ LINK = 0, THREAD = 1 }PointTag; typedef struct BiThrNode { BiThrNode *LChild; BiThrNode *RChild; PointTag LTag, RTag; ElemType data; }BiThrNode, *BiThrTree; BiThrNode *Buy_ThreadNode(); BiThrNode *Creat_BiThrTree(char *str);//创建二叉树 void InOrder_ThrTree(BiThrNode *ptr);//递归中序 void InOrderThrTree(BiThrNode *T);/*中序线索化二叉树*/ void ThrTreeInOrder(BiThrNode *ptr);//非递归中序遍历线索二叉树 void Reverse_ThrTreeInOrder(BiThrNode *ptr);//逆序非递归中序遍历线索二叉树 BiThrNode *Buy_ThreadNode()//开辟并初始化结点 { BiThrNode *s = (BiThrNode *)malloc(sizeof(BiThrNode)); if (NULL == s) { return NULL; } memset(s, 0, sizeof(BiThrNode)); return s; } BiThrNode *CreateThr(char *&str)//直接建立二叉树 { BiThrNode *p = NULL; if (*str != '#') { p = Buy_ThreadNode(); p->data = *str; p->LChild = CreateThr(++str); p->RChild = CreateThr(++str); } return p; } BiThrNode *Creat_BiThrTree(char *str)//直接创建二叉树 { if (NULL == str) { return NULL; } else { return CreateThr(str); } } void InOrder_ThrTree(BiThrNode *ptr)//递归中序 { if (ptr != NULL) { InOrder_ThrTree(ptr->LChild); printf("%c ", ptr->data); InOrder_ThrTree(ptr->RChild); } } //![中序线索化二叉树示意图](https://img-blog.csdn.net/20171007185625933?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2JhaV9hYWE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) void Make_Tree(BiThrNode *ptr, BiThrNode *&p)//中序线索化 { if (ptr) { Make_Tree(ptr->LChild, p);//递归线索化左子树 if (ptr->LChild == NULL)//无左孩子 { ptr->LTag = THREAD;//前驱线索化 ptr->LChild = p;//左孩子指针指向前驱 } if (ptr->RChild != NULL && p->RChild == NULL)//前驱无右孩子 { p->RTag = THREAD;//后继线索 p->RChild = ptr;//前驱右孩子指针指向后继 } p = ptr;//保证pre指向ptr的前驱 Make_Tree(ptr->RChild, p);//递归线索化右子树 } } void InOrderThrTree(BiThrNode *ptr) /*中序线索化二叉树*/ { BiThrNode *p = NULL; Make_Tree(ptr, p); p->RChild = NULL; p->RTag = THREAD; } BiThrNode *first(BiThrNode *ptr)//找到当前结点的最左孩子结点 { while (ptr != NULL && ptr->LTag != THREAD) { ptr = ptr->LChild; } return ptr; } BiThrNode *next(BiThrNode *ptr)//找后继结点 { if (ptr == NULL) return NULL; if (ptr->RTag == THREAD) { return ptr->RChild; } else { return first(ptr->RChild); } } void ThrTreeInOrder(BiThrNode *ptr)//非递归中序遍历线索化二叉树 { for (BiThrNode *p = first(ptr); p != NULL; p = next(p)) { printf("%c ", p->data); } } BiThrNode *Last(BiThrNode *p)//找到当前结点的最右孩子结点 { while (p != NULL && p->RTag != THREAD) { p = p->RChild; } return p; } BiThrNode *prev(BiThrNode *p)//找前继结点 { if (NULL == p) return NULL; if (p->LTag == THREAD) { return p->LChild; } else { return Last(p->LChild); } } void Reverse_ThrTreeInOrder(BiThrNode *ptr)//逆序非递归中序遍历线索二叉树 { for (BiThrNode *p = Last(ptr); p != NULL; p=prev(p)) { printf("%c ", p->data); } }
测试代码
void main() { BiThrNode *T = NULL; char *str = "ABC##DE##F##G#H##"; T = Creat_BiThrTree(str); InOrder_ThrTree(T); printf("\n"); InOrderThrTree(T); ThrTreeInOrder(T); printf("\n"); Reverse_ThrTreeInOrder(T); printf("\n"); }
相关文章推荐
- 给出二叉树,将二叉树进行中序线索化,在根据中序线索化二叉树,找出给定节点的前序后继节点,和给出节点的后序后继节点
- 二叉树的线索化以及遍历(前序、中序、后序)
- 二叉树的中序线索化以及遍历
- 线索化二叉树(前序线索化,中序线索化)
- 二叉树学习总结:二叉树的基本操作、遍历二叉树、中序线索化二叉树、中序遍历线索二叉树
- 二叉树线索化以及线索化前序、中序、后序遍历
- 二叉树的线索化以及 线索化的先序,中序,后序遍历
- 建立线索二叉链表结构,实现二叉树的中序线索化及中序线索二叉树的遍历算法
- 二叉树线索化以及线索化的先序、中序、后序遍历
- 第十一周项目1-(3)中序线索化二叉树的算法验证
- 第十周项目3中序线索化二叉树的算法验证
- 二叉树根据先序,中序创建二叉树,后序,中序创建二叉树,层次序列,中序遍历创建二叉树。
- 二叉树的创建以及前序、中序、后序遍历
- 中序线索化二叉树
- 二叉树的非递归前序、中序以及后序遍历C++模版类实现
- (原创)中序线索化二叉树
- 第11周项目1-验证算法(3)中序线索化二叉树的算法验证
- 第十周项目1(3)-中序线索化二叉树的算法验证
- 第十一周上机实践—项目1(3)—中序线索化二叉树的算法验证
- 第十周 项目4 - 线索化二叉树(中序)