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

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

2016-07-01 12:05 369 查看
全部代码如下

#include <iostream>
#include <stdio.h>

using namespace std;

class Tree
{
public:
Tree();
Tree* malloc_node();
int free_node(Tree*&);
int create(Tree *&);
int preorder(Tree*);
int preorder_club(Tree*);
int insert_head(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->preorder(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::preorder(Tree *node)
{
if (!node)
{
return 0;
}

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

if (!ltag)
{
preorder(node->lchild);
}

if (!rtag)
{
preorder(node->rchild);
}

return 0;
}
int Tree::preorder_club(Tree *node)
{
if (node)
{
if (!node->lchild)
{
node->ltag = 1;
node->lchild = pre;
}

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

pre = node;

if (!node->ltag)
{
preorder_club(node->lchild);
}

if (!node->rtag)
{
preorder_club(node->rchild);
}
}

return 0;
}

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

pre = head;

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

preorder_club(node);

pre->rtag = 1;
pre->rchild = head;

head->rchild = pre;

return 0;
}

int Tree::print_club()
{
Tree *p = head->lchild;

while (p != head && p != NULL)
{
cout << "树转换为循环双向链表后的数据为:" << p->number << endl;

if (!p->ltag)
{
p = p->lchild;
}
else
{
p = p->rchild;
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 二叉树