线索二叉树

二叉树的定义

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值