数据结构也不是那么没意思之前序二叉树+二叉树转伪双向循环链表
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;
}
#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;
}
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- 举例讲解C语言程序中对二叉树数据结构的各种遍历方式
- C++非递归队列实现二叉树的广度优先遍历
- PHP实现的线索二叉树及二叉树遍历方法详解
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort