C++构造中序线索二叉树(链)

通过构造中序线索二叉树,在对中序线索二叉树中序遍历时,实现O(1)的空间复杂度。

Code
#include<iostream>
#include<string>
#include<algorithm>
#include<stack>
using namespace std;
struct tbtNode
{
	char data;
	int ltag;//0表示lchild域指向结点的左孩子  1表示lchild域指向结点的前驱
	int rtag;//0表示rchild域指向结点的右孩子  1表示rchild域指向结点的后继
	tbtNode* lchild, * rchild;
};
void create_tree(tbtNode*& root, string& str) {//二叉树括号表示串 创建二叉链  利用栈
	root = NULL;
	stack<tbtNode*> S;
	tbtNode* p;
	int k = 0;
	for (int i = 0; i < str.length(); i++) {
		switch (str[i])
		{
		case '(':S.push(p); k = 1; break;
		case ')':S.pop(); break;
		case ',':k = 2; break;
		default: {
			p = new tbtNode;
			p->data = str[i];
			p->lchild = p->rchild = NULL;
			if (root == NULL) root = p;
			else {
				switch (k)
				{
				case 1:S.top()->lchild = p; break;
				case 2:S.top()->rchild = p; break;
				}
			}
		}
		 break;
		}
	}
}

tbtNode* pre;
void thread(tbtNode*& root) {//对二叉树进行中序线索化
	if (root) {
		thread(root->lchild);
		if (root->lchild == NULL) {
			root->lchild = pre; root->ltag = 1;
		}
		else root->ltag = 0;
		if (pre->rchild == NULL) {
			pre->rchild = root; pre->rtag = 1;
		}
		else pre->rtag = 0;
		pre = root;
		thread(root->rchild);
	}
}

tbtNode* creat_thread(tbtNode*& root) {//创建中序线索二叉树
	tbtNode* tbtroot=new tbtNode;
	tbtroot->ltag = 0; tbtroot->rtag = 1; tbtroot->rchild = root;
	if (root == NULL) tbtroot->rchild = tbtroot;
	else {
		tbtroot->lchild = root;
		pre = tbtroot;
		thread(root);
		pre->rchild = tbtroot;
		pre->rtag = 1;
		tbtroot->rchild = pre;
	}
	return tbtroot;
}

void th_in_order(tbtNode*& tbtroot) {//中序遍历中序线索二叉树
	tbtNode* p = tbtroot->lchild;
	while (p != tbtroot) {
		while (p->ltag == 0) p = p->lchild;
		cout << p->data;
		while (p->rtag == 1 && p->rchild != tbtroot) {
			p = p->rchild;
			cout << p->data;
		}
		p = p->rchild;
	}
}

int main() {
	tbtNode* root, * tbtroot;
	string s = "A(B(D(,G)),C(E,F))";
	create_tree(root, s);//创建二叉树
	tbtroot=creat_thread(root);//中序线索化二叉树
	th_in_order(tbtroot);//中序遍历中序线索二叉树
	return 0;
}

猜你喜欢

转载自blog.csdn.net/buibuilili/article/details/107879744