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
- 线索二叉树C/C++
- (C++)二叉树的线索化 / 线索二叉树
- 数据结构-------------线索二叉树(c语言)
- 二叉树线索化C代码实现
- 【c++】二叉树的线索化
- C语言线索二叉树的实现
- 线索二叉树的c语言实现
- 线索二叉树 --->树
- 线索二叉树算法
- C#线索二叉树
- 线索二叉树
- C#线索二叉树
- 线索二叉树
- 线索二叉树
- 线索化二叉树
- 线索二叉树
- C#线索二叉树
- C#线索二叉树
- Android Studio工具使用技巧
- 单选/多选框 美观UI
- 数据结构-树(基本概念整合)
- FLV学习资料
- TCP Socket客户端编程(C++)
- C++ 线索二叉树
- mysql日志文件
- 关于iOS 8, 8.2 蓝牙广播包数据变化的问题
- 数组游标访问
- 四套读写方案 外加 序列化和反序列化
- xml动画详解
- hdu2089——不要62(数位DP入门)
- 数组方法与属性(一)
- python day18(20170414 )