您的位置:首页 > 理论基础 > 数据结构算法

数据结构也不是那么没意思之后序二叉树+二叉树转伪双向循环链表

2016-07-03 13:53 337 查看
全部代码
#include <iostream>

using namespace std;

class Tree
{
public:
Tree();
Tree* malloc_node();
int free_node(Tree*&);
int create(Tree*&);
int rearorder(Tree*);
int rear_club(Tree*);
int insert_head(Tree*);
Tree* parent(Tree*);
int print_club();

private:
int number;
Tree *lchild, *rchild;
int ltag, rtag;
};

Tree *pre = NULL; //记录线索化二叉树的时候刚刚访问过的节点
Tree *head = NULL; //线索化后做链表头指针  里面记录节点总数 根据遍历顺序不同head的左右孩子也不同

int main()
{
Tree *root = NULL;

root->create(root);
root->rearorder(root);

root->insert_head(root);
root->print_club();

return 0;
}

Tree::Tree() : number(-9999), lchild(NULL), rchild(NULL), ltag(0), rtag(0)
{
;
}

Tree* Tree::malloc_node()
{
return new Tree;
}

int Tree::free_node(Tree *&node)
{
delete node;
node = NULL;

return 0;
}

int Tree::create(Tree *&node)
{
int number = 0;

cout << "请输入节点数据:" << endl;
cin >> number;

if (number == -1)
{
cout << "返回上层成功" << endl;

return 0;
}

node = malloc_node();
node->number = number;

cout << "目前位置为" << number << "的左子树,";
create(node->lchild);

cout << "目前位置为" << number << "的右子树,";
create(node->rchild);

return 0;
}

int Tree::rearorder(Tree *node)
{
if (!node)
{
return 0;
}

rearorder(node->lchild);

rearorder(node->rchild);

cout << "后序遍历结果为:" << node->number << endl;

return 0;
}

int Tree::rear_club(Tree *node)
{
if (node)
{
rear_club(node->lchild);

rear_club(node->rchild);

if (!node->lchild)
{
node->ltag = 1;
node->lchild = pre;
}

if (!pre->rchild)
{
pre->rtag = 1;
pre->rchild = node;
}

pre = node;
}

return 0;
}

int Tree::insert_head(Tree *node)
{
head = head->malloc_node();

pre = head;

head->ltag = 1;
head->lchild = node;

rear_club(node);

head->rchild = pre;

return 0;
}

int Tree::print_club()
{
Tree* temp = head->lchild;
Tree* par = NULL;

while(true)  //循环目的 找到后序输出的正确开头 也就是最后一个左孩子
{
while(temp->ltag == 0)
{
temp = temp->lchild;
}

if(temp->rtag == 0)
{
temp = temp->rchild;
}
else
{
break;
}
}

while(temp != head)
{
cout << "后序线索化遍历树结果为:" << temp->number << endl;

par = parent(temp);  //获得节点temp的父节点

if(par == head) //若父节点是head则节点temp为根节点,无后继
{
temp = head;
}
else if(par->rtag == 1 || temp == par->rchild) //无右兄弟的左节点或是右儿子
{
temp = par;
}
else  //节点temp是左孩子,且有右兄弟
{
while(par->rtag == 0)
{
par = par->rchild;

while(par->ltag == 0)
{
par = par->lchild;
}
}

temp =par;
}
}

return 0;
}

Tree* Tree::parent(Tree *node)  //获取指定节点节点的父节点
{
Tree* temp = head;

if(temp->lchild == node)
{
return temp;
}
else
{
temp = temp->lchild;

while(temp->lchild != node && temp->rchild != node)
{
if(temp->rtag == 0)//判断节点右孩子是否为线索 如果不是那么就进右孩子 是就进左孩子
{
temp = temp->rchild;
}
else
{
temp = temp->lchild;  //有左孩子进左孩子,没有左孩子,进前驱;
}
}
}
return temp;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 二叉树