通过构造中序线索二叉树,在对中序线索二叉树中序遍历时,实现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;
}