5)二叉树中序线索化

  1 #include "iostream"
  2 #include "stdlib.h"
  3 using namespace std;
  4
  5 typedef char type;
  6 struct bnode{
  7     type data;
  8     bnode *lchild,*rchild;
  9     int rtag,ltag;
 10 };
 11
 12 const int lrtag = 0;
 13 class thbtree{
 14 public:
 15     thbtree();//初始化
 16     ~thbtree();
 17     void create_thbtree(bnode *&T);//建立二叉树
 18     void inorder(bnode *T);//先序遍历
 19     bnode *in_thread(bnode *&T);
 20     void inthread(bnode *p,bnode *&pre);
 21
 22 private:
 23     int count;//元素个数统计
 24 };
 25
 26 thbtree::thbtree()//初始化
 27 {
 28     count = 0;
 29 }
 30
 31 void thbtree::create_thbtree(bnode *&T)//建立二叉树
 32 {
 33     type ch;
 34     cin>>ch;
 35     if(ch==‘.‘)T=NULL;
 36     else {
 37         T = new bnode;
 38         T->data = ch;
 39         T->ltag = lrtag;
 40         T->rtag = lrtag;
 41         count++;
 42         create_thbtree(T->lchild);
 43         create_thbtree(T->rchild);
 44     }
 45 }
 46
 47 void thbtree::inthread(bnode *p,bnode *&pre)
 48 {
 49     if(p)
 50     {
 51         inthread(p->lchild,pre);//左子树线索化
 52         if(!p->lchild)//如果p的左子树为空,给P点加前驱线索
 53         {
 54             p->ltag = 1;
 55             p->lchild = pre;
 56         }else{
 57             p->ltag = 0;
 58         }
 59         if(pre && !pre->rchild)
 60         {
 61             pre->rtag = 1;
 62             pre->rchild = p;
 63         }
 64         pre = p;
 65         inthread(p->rchild,pre);//右子树线索化
 66     }
 67 }
 68 bnode *thbtree::in_thread(bnode *&T)
 69 {
 70     bnode *pre = NULL;
 71     bnode *head;
 72     head =  new bnode;
 73     head->ltag = 0;
 74     head->rtag = 1;
 75     head->lchild = head;
 76     if(!T)
 77     {
 78         head->lchild = head;
 79     }else{
 80         head->lchild = T;
 81         pre = head;
 82         inthread(T,pre);
 83         pre->rchild = head;
 84         pre->rtag=1;
 85         head->rchild = pre;
 86     }
 87     T =head;
 88     return head;
 89 }
 90
 91
 92 void thbtree::inorder(bnode*T)//中序遍历
 93 {
 94     bnode *p;
 95     p = T->lchild;
 96     while(p!=T)
 97     {
 98         while(p->ltag==0)
 99         {
100             p=p->lchild;
101         }
102         cout<<p->data<<" ";
103         while(p->rtag==1&&p->rchild!=T)
104         {
105             p = p->rchild;
106             cout<<p->data<<" ";
107         }
108         p = p->rchild;
109     }
110 }
111
112 thbtree::~thbtree(){}
113
114 int main()
115 {
116     thbtree Tree;
117     bnode *T;
118     cout<<"Create Tree:";
119     Tree.create_thbtree(T);
120     cout<<"Tree finished!"<<endl;
121     Tree.in_thread(T);
122     cout<<"INorder Tree:";
123     Tree.inorder(T);
124     cout<<endl;
125     return 0;
126 }
时间: 2024-10-15 13:27:18

5)二叉树中序线索化的相关文章

【算法与数据结构】二叉树 中序线索

中序线索二叉树 /************************************************************************ 线索二叉树 二叉树的节点有五部分构造 ----------------------------------------- | lChild | lTag | value | rTag | rChild | ----------------------------------------- lChild = (lTag == 0 ? 左

【数据结构】线索化二叉树中序线索化的递归写法和非递归写法

二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历.用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继. 为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息.所以引入了线索化二叉树.下面我们讲一下线索化二叉树中序线索化的两种实现方法: (1).递归实现中序线索化二叉树 首先我们先看一下线索化二叉树的结构 enum PointerTag{ THREAD, LINK 

二叉树的中序线索化以及遍历

#include <stdio.h> #include <stdlib.h> typedef struct Node { char data; int Ltag; struct Node* LChild; int Rtag; struct Node* RChild; }BitNode, * BiTree; //先序创建二叉树 void CreatBiTree(BiTree* root) { char ch; ch = getchar(); if (ch == '.') *root

为什么二叉树总能中序线索化

为什么二叉树为什么总是可以按照中序遍历线索化空指针是够但怎么保证不会有一个有左右孩子的节点不被别人指到想了想可以用类似于数学归纳法这样证明: 先讨论三种最简单的情形 1. ab      c b左指针预留b右指针指向ac左指针指向ac右指针预留2. ab    NULL b左指针预留b右指针指向a右指针预留3. aNULL     c a左指针预留c左指针指向ac右指针预留 可以看出: 最简单的结构总能预留出两个多余的指针, 由以上三种子树看作一个整体, 以上三种子树按照以上三种方式组成的树也总

二叉树的前序、中序和后序线索化

二叉树是一种非线性结构,遍历二叉树需要通过递归或者用栈辅助实现非递归的遍历. 用二叉树作为压缩存储结构时,取到一个结点,只能获取节点的左孩子和右孩子,不能直接得到结点的任一遍历序列的前驱或者后继.为了实现这种遍历,偶们利用二叉树中指向左右子树的空指针来存放结点的前驱和后继. 线索化二叉树思路: 当某一结点的左结点或结右点存在NULL时,则该结点的为空的子结点需要线索化. 在进行线索化时,结点的前驱指向前一个访问过的结点,故定义一个指针prev来保存前一个结点:结点的后继偶们并不知道,则对于未来的

中序线索二叉树创建及其遍历

通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数.准确的说,n各结点的二叉链表共有2n个链域,非空链域为n-1个,但其中的空链域却有n+1个.如下图所示. 因此,提出了一种方法,利用原来的空链域存放指针,指向树中其他结点.这种指针称为线索. 记ptr指向二叉链表中的一个结点,以下是建立线索的规则: (1)如果ptr->lchild为空,则存放指向中序遍历序列中该结点的前驱结点.这个结点称为ptr的中序前驱: (2)如果ptr->rchild为空,则存放指向中序遍历

中序线索化二叉树

中序线索化二叉树 1 void Tree::_inTree(Node * root, Node * &pre) { 2 if (root == NULL) { // 结点为空, 1:二叉树为空 2:已到达右子树的最后一个右结点的 rchild 3 return; 4 } 5 _inTree(root->lchild, pre); // 到达当前结点的左子树的底部左结点 6 if (root->lchild == NULL) { 7 root->ltag = nChild; //

中序线索二叉树

虽说对于二叉树的遍历操作来说非递归法使用用户自定义的栈来代替递归使用时的系统栈,可以得到不小的效率提升,但将二叉树线索化时能将用户栈也省略掉进一步提高了效率. 对于二叉树的链表结构,n个结点的二叉树有n+1个空链域(每个叶节点都有两个空链域),而线索二叉树就把这些空链域有效的利用了起来,在一般的二叉树中,我们只知道每个结点的左右孩子,并不知道某个结点在某种遍历方式下的直接前驱和直接后继,如果能够知道前驱和后继信息,就可以把二叉树看作一个链表结构,从而可以像遍历链表那样来遍历二叉树,进而提高效率.

数据结构:中序线索二叉树

//所谓线索二叉树无非是为了让原本指向NULL的节点指向一个详细的 //已经存在的节点,逻辑上实现指针的无空指向的实现.以下是我中 //序线索二叉树的实现.还是把先序线索二叉树与后序线索分开来写吧. #include<iostream> using namespace std; template<typename Type> struct Node { Type data; bool rflags;//false为线. bool lflags; Node<Type> *