C++ 线索二叉树

来源:互联网 发布:最后一战源码 编辑:程序博客网 时间:2024/04/30 00:48

所谓线索二叉树其实就是利用n+1个空指针所浪费的空间,n+1个指针能形成n条链,来保存节点的前驱后继,而形成一个链状的排列。对于线索二叉树的原理,应该是基于中序遍历而衍生出来的,把3个节点看做一个整体,那么最左边能留出前驱,最右边能留出后继,而这3个节点已经用2个指针连成了一条线,以此类推,足以保证树中所有节点都被连在一条线上。

代码用上一篇二叉树的代码就行修改,node 增添 leftTag、rightTag 用于线索二叉树的遍历访问,最后用非递归的中序遍历来验证线索二叉树


#include<iostream>using namespace std;typedef enum{Link,Thread}PointerType;template <typename T>struct Node{T data;PointerType leftTag;PointerType rightTag;Node<T>* left;Node<T>* right;};Node<int>* pre;template <typename T>void Create(Node<T>*& node,T array[],int& index,int& length){if(index>=length||array[index]==-1){node=0; }else{node=new Node<T>();node->data=array[index];Create(node->left,array,++index,length);Create(node->right,array,++index,length);}}template <typename T>void PreOrderTraversal(Node<T>*& node,void(*func)(Node<T>*& arg)){if(node!=0){if(func!=0){func(node);}PreOrderTraversal(node->left,func);PreOrderTraversal(node->right,func);}}template <typename T>void InOrderTraversal(Node<T>*& node,void(*func)(Node<T>*& arg)){if(node!=0){InOrderTraversal(node->left,func);if(func!=0){func(node);}InOrderTraversal(node->right,func);}}template <typename T>void PostOrderTraversal(Node<T>*& node,void(*func)(Node<T>*& arg)){if(node!=0){PostOrderTraversal(node->left,func);PostOrderTraversal(node->right,func);if(func!=0){func(node);}}}template <typename T>void LinearNode(Node<T>*& node){if(node->left==0){node->leftTag=Thread;node->left=pre;}else{node->leftTag=Link;}if(pre->right==0){pre->rightTag=Thread;pre->right=node;}else{pre->rightTag=Link;}pre=node;} template <class T>Node<T>* LinearTree(Node<T>*& tree){void(*Delegate)(Node<T>*& arg);pre=new Node<T>;pre->data=0;pre->leftTag=Link;pre->left=tree;pre->rightTag=Thread;pre->right=0;Node<T>* first=pre;Delegate=LinearNode;InOrderTraversal(tree,Delegate);pre->right=first;pre->rightTag=Thread;first->right=pre;return first;}template <typename T>void Delete(Node<T>*& node){delete node;}template <typename T>void Show(Node<T>*& node){cout<<node->data<<endl;}/*125346*/int main(){void(*Delegate)(Node<int>*& arg);Delegate=0;int array[]={1,2,3,-1,-1,4,-1,-1,5,6,-1,-1,-1}; Node<int>* tree;int index=0;int length=sizeof(array)/sizeof(array[0]);Create(tree,array,index,length);//Delegate=Show; //InOrderTraversal(tree,Delegate);Node<int>* first=LinearTree(tree);//InOrderTraversalNode<int>* temp=first->left;while(temp!=first){while(temp->leftTag==Link){temp=temp->left;}cout<<temp->data<<endl;while(temp->rightTag==Thread&&temp->right!=first){temp=temp->right;cout<<temp->data<<endl;}temp=temp->right;}//Delegate=Delete;//PostOrderTraversal(tree,Delegate);return 0;}


0 0