二叉树的定义
#ifndef TREE
#define TREE
#include <iostream>
using namespace std;
struct TreeNode {
char val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
struct TreeNodeThr{
char val;
TreeNodeThr *left;
TreeNodeThr *right;
bool Lflag;
bool Rfalg;
TreeNodeThr(int x):val(x), left( NULL),right(NULL),Lflag(false),Rfalg(false){}
};
#endif
二叉树的前序线索化和遍历
线索化二叉树:
(1)前一个节点的右子树为空则,右子树指向当前节点
(2)当前节点的左子树为空则,左子树指向前一个节点
// preorder thread bitree
void PreThreadBiTree(TreeNodeThr *root, TreeNodeThr *&begin)
{
if(root != NULL){
if(begin != NULL && begin->right == NULL){
begin->right = root;
begin->Rfalg = true;
}
if(root->left == NULL){
root->left = begin;
root->Lflag = true;
}
begin = root;
if(!root->Lflag)// prevent thread previous node
PreThreadBiTree(root->left, begin);
if(!root->Rfalg)//prevent thread previous node
PreThreadBiTree(root->right, begin);
}
}
// preorder thread bitree
void PreorderTraverseBiTree(TreeNodeThr *root)
{
TreeNodeThr* p = root;
while(p!=NULL){
while(!p->Lflag){
cout<<p->val<<endl;
p = p->left;
}
cout<<p->val<<endl;
p=p->right;
}
}
二叉的中序线索化
// thread bitree in midorder
void InThreadBiTree(TreeNodeThr *root, TreeNodeThr *&begin)
{
if(root != NULL){
InThreadBiTree(root->left, begin);
if(begin != NULL && begin->right == NULL) {
begin->right = root;
begin->Rfalg = true;
}
if(root->left == NULL){
root->left = begin;
root->Lflag = true;
}
begin = root;
InThreadBiTree(root->right,begin);
}
}
//traverse bitree in mid order
void InorderBiTreeThr(TreeNodeThr *root)
{
TreeNodeThr *p = root;
while(p != NULL){
while(!p->Lflag)
p = p->left;
cout<<p->val<<endl;
while(p->Rfalg){
p = p->right;
cout<<p->val<<endl;
}
p = p->right;
}
}
二叉树的后续线索化
// post order thread bitree
void PostThreadBiTree(TreeNodeThr *root, TreeNodeThr *&begin)
{
if(root != NULL){
PostThreadBiTree(root->left, begin);
PostThreadBiTree(root->right,begin);
if(begin != NULL && begin->right == NULL){
begin->right = root;
begin->Rfalg = true;
}
if(root->left == NULL){
root->left = begin;
root->Lflag = true;
}
begin = root;
}
}
//post order traverse bitree
void PostTraverseBiTree(TreeNodeThr *root, TreeNodeThr *begin)
{
vector<char> temp;
TreeNodeThr *p = root;
while(p != begin){
while(!p->Rfalg){
temp.insert(temp.begin(), p->val);
p=p->right;
}
temp.insert(temp.begin(), p->val);
p=p->left;
}
vector<char>::const_iterator iter = temp.begin();
while(iter != temp.end()){
cout<<*iter<<"\t";
iter++;
}
cout<<endl;
}
参考:
http://waret.iteye.com/blog/709779