数据结构之树_Tree
来源:互联网 发布:java定义二维数组 编辑:程序博客网 时间:2024/05/20 12:24
#ifndef TREE_H_INCLUDED
#define TREE_H_INCLUDED
#include<iostream>
#include <queue>
#include<stack>
template <class T>
class TreeNode//树的节点
{
private:
T data;
TreeNode<T> *firstChild, *nextBrother;//左孩子和右兄弟
public:
TreeNode<T>(T value = 0, TreeNode<T>* L = NULL, TreeNode<T>* R = NULL) :
data(value), firstChild(L), nextBrother(R){}
T& GetData(){ return data; }
TreeNode<T>* & GetFirstChild(){ return firstChild; }
TreeNode<T>* & GetNextBrother(){ return nextBrother; }
#define TREE_H_INCLUDED
#include<iostream>
#include <queue>
#include<stack>
template <class T>
class TreeNode//树的节点
{
private:
T data;
TreeNode<T> *firstChild, *nextBrother;//左孩子和右兄弟
public:
TreeNode<T>(T value = 0, TreeNode<T>* L = NULL, TreeNode<T>* R = NULL) :
data(value), firstChild(L), nextBrother(R){}
T& GetData(){ return data; }
TreeNode<T>* & GetFirstChild(){ return firstChild; }
TreeNode<T>* & GetNextBrother(){ return nextBrother; }
};
template<class T>
class Tree
{
private:
TreeNode<T>* root;
T stop;
public:
Tree(T tostop='#') :root(NULL), stop(tostop){}
~Tree(){ DeleTree(root); }
TreeNode<T>* CreatTree();//创建树
void PreOrder(TreeNode<T>* t);//先根遍历
void PostOrder(TreeNode<T>* t);//后跟遍历
void LevelOrder(TreeNode<T>* t);//层次遍历
void NorePreOrder(TreeNode<T>* t);//先根遍历迭代算法
void NorePostOrder(TreeNode<T>* t);//后跟遍历迭代算法
TreeNode<T>* FindFather(const TreeNode<T>* p, TreeNode<T>* t);//查找父结点
TreeNode<T>* FindData(const T& item, TreeNode<T>* t);//查找值所在的结点
TreeNode<T>* GetRoot(){ return root; }
void DeleTree(TreeNode<T>* t);
// TreeNode<T>* FirstChild(TreeNode<T>* t);//t结点的大孩子
// TreeNode<T>* NextBrother(TreeNode<T>* t);//t结点的大兄弟
};
class Tree
{
private:
TreeNode<T>* root;
T stop;
public:
Tree(T tostop='#') :root(NULL), stop(tostop){}
~Tree(){ DeleTree(root); }
TreeNode<T>* CreatTree();//创建树
void PreOrder(TreeNode<T>* t);//先根遍历
void PostOrder(TreeNode<T>* t);//后跟遍历
void LevelOrder(TreeNode<T>* t);//层次遍历
void NorePreOrder(TreeNode<T>* t);//先根遍历迭代算法
void NorePostOrder(TreeNode<T>* t);//后跟遍历迭代算法
TreeNode<T>* FindFather(const TreeNode<T>* p, TreeNode<T>* t);//查找父结点
TreeNode<T>* FindData(const T& item, TreeNode<T>* t);//查找值所在的结点
TreeNode<T>* GetRoot(){ return root; }
void DeleTree(TreeNode<T>* t);
// TreeNode<T>* FirstChild(TreeNode<T>* t);//t结点的大孩子
// TreeNode<T>* NextBrother(TreeNode<T>* t);//t结点的大兄弟
};
//先跟序列构造树
template <class T>
TreeNode<T>* Tree<T>::CreatTree()
{
TreeNode<T>* newRoot;
T item;
cout << "请输入树的一个结点:";
cin >> item;
if (item == stop)
{
newRoot = NULL;
}
else
{
newRoot = new TreeNode<T>(item);
newRoot->GetFirstChild() = CreatTree();
newRoot->GetNextBrother() = CreatTree();
}
root = newRoot;
return newRoot;
}
template <class T>
TreeNode<T>* Tree<T>::CreatTree()
{
TreeNode<T>* newRoot;
T item;
cout << "请输入树的一个结点:";
cin >> item;
if (item == stop)
{
newRoot = NULL;
}
else
{
newRoot = new TreeNode<T>(item);
newRoot->GetFirstChild() = CreatTree();
newRoot->GetNextBrother() = CreatTree();
}
root = newRoot;
return newRoot;
}
//先跟遍历
template <class T>
void Tree<T>::PreOrder(TreeNode<T>* t)
{
if (t != NULL)
{
cout << t->GetData();
PreOrder(t->GetFirstChild());
PreOrder(t->GetNextBrother());
}
template <class T>
void Tree<T>::PreOrder(TreeNode<T>* t)
{
if (t != NULL)
{
cout << t->GetData();
PreOrder(t->GetFirstChild());
PreOrder(t->GetNextBrother());
}
/*
if(t!=NULL)
{
cout<<t->GetData();
TreeNode<T>* child=NULL;
child=FirstChild(t);
while(child)
{
PreOrder(child);
child=NextBrother(child);
}
}
*/
}
if(t!=NULL)
{
cout<<t->GetData();
TreeNode<T>* child=NULL;
child=FirstChild(t);
while(child)
{
PreOrder(child);
child=NextBrother(child);
}
}
*/
}
//先根遍历,迭代算法
template<class T>
void Tree<T>::NorePreOrder(TreeNode<T>* t)
{
if (t == NULL)
return;
std::stack<TreeNode<T>*> treeStack;
TreeNode<T>* p = t;
do
{
while (p != NULL)
{
cout << p->GetData();
treeStack.push(p);
p = p->GetFirstChild();
}
while (p == NULL&&!treeStack.empty())
{
p = treeStack.top();
treeStack.pop();
p = p->GetNextBrother();
template<class T>
void Tree<T>::NorePreOrder(TreeNode<T>* t)
{
if (t == NULL)
return;
std::stack<TreeNode<T>*> treeStack;
TreeNode<T>* p = t;
do
{
while (p != NULL)
{
cout << p->GetData();
treeStack.push(p);
p = p->GetFirstChild();
}
while (p == NULL&&!treeStack.empty())
{
p = treeStack.top();
treeStack.pop();
p = p->GetNextBrother();
}
} while (!treeStack.empty());
} while (!treeStack.empty());
}
//后跟遍历
template <class T>
void Tree<T>::PostOrder(TreeNode<T>* t)
{
if (t != NULL)
{
PostOrder(t->GetFirstChild());
cout << t->GetData();
PostOrder(t->GetNextBrother());
}
}
template <class T>
void Tree<T>::PostOrder(TreeNode<T>* t)
{
if (t != NULL)
{
PostOrder(t->GetFirstChild());
cout << t->GetData();
PostOrder(t->GetNextBrother());
}
}
//后根遍历迭代算法
template <class T>
void Tree<T>::NorePostOrder(TreeNode<T>* t)
{
if (t == NULL)
return;
std::stack<TreeNode<T>*> treeStack;
TreeNode<T>* p = t;
do
{
while (p != NULL)
{
template <class T>
void Tree<T>::NorePostOrder(TreeNode<T>* t)
{
if (t == NULL)
return;
std::stack<TreeNode<T>*> treeStack;
TreeNode<T>* p = t;
do
{
while (p != NULL)
{
treeStack.push(p);
p = p->GetFirstChild();
}
while (p == NULL&&!treeStack.empty())
{
p = treeStack.top();
treeStack.pop();
cout << p->GetData();
p = p->GetNextBrother();
p = p->GetFirstChild();
}
while (p == NULL&&!treeStack.empty())
{
p = treeStack.top();
treeStack.pop();
cout << p->GetData();
p = p->GetNextBrother();
}
} while (!treeStack.empty());
}
} while (!treeStack.empty());
}
//层次遍历
template <class T>
void Tree<T>::LevelOrder(TreeNode<T>* t)
{
std::queue<TreeNode<T>*> treeQueue;
if (t != NULL)
{
TreeNode<T>* p;
treeQueue.push(t);
while (!treeQueue.empty())
{
p = treeQueue.front();
cout << p->GetData();
treeQueue.pop();
p = p->GetFirstChild();
while (p != NULL)//一层一层的遍历
{
treeQueue.push(p);//先看大孩子
p = p->GetNextBrother();//再看大兄弟
}
template <class T>
void Tree<T>::LevelOrder(TreeNode<T>* t)
{
std::queue<TreeNode<T>*> treeQueue;
if (t != NULL)
{
TreeNode<T>* p;
treeQueue.push(t);
while (!treeQueue.empty())
{
p = treeQueue.front();
cout << p->GetData();
treeQueue.pop();
p = p->GetFirstChild();
while (p != NULL)//一层一层的遍历
{
treeQueue.push(p);//先看大孩子
p = p->GetNextBrother();//再看大兄弟
}
}
}
}
}
//查找父结点
template <class T>
TreeNode<T>* Tree<T>::FindFather(const TreeNode<T>* p, TreeNode<T>* t)
{
if (t == NULL)
return NULL;
if (t->GetFirstChild() == p)
return t;
TreeNode<T>* q;
TreeNode<T>* result;
q = t->GetFirstChild();//从第一棵子树开始
while (q != NULL&&q != p)
{
result = FindFather(p, q);//若找到,则返回,若未找到,则下一棵子树
if (result == NULL)
q = q->GetNextBrother();
else
return result;
}
if (q == p)//若q是t的一个子节点,则将t返回
return t;
else
return NULL;
}
template <class T>
TreeNode<T>* Tree<T>::FindFather(const TreeNode<T>* p, TreeNode<T>* t)
{
if (t == NULL)
return NULL;
if (t->GetFirstChild() == p)
return t;
TreeNode<T>* q;
TreeNode<T>* result;
q = t->GetFirstChild();//从第一棵子树开始
while (q != NULL&&q != p)
{
result = FindFather(p, q);//若找到,则返回,若未找到,则下一棵子树
if (result == NULL)
q = q->GetNextBrother();
else
return result;
}
if (q == p)//若q是t的一个子节点,则将t返回
return t;
else
return NULL;
}
//查找值结点
template <class T>
TreeNode<T>* Tree<T>::FindData(const T& item, TreeNode<T>* t)
{
if (t == NULL)
return NULL;
if (t->GetData() == item)
return t;
else
{
TreeNode<T>* p = t->GetFirstChild();
TreeNode<T>* result = NULL;
while (p != NULL && (result = FindData(item, p)) != NULL)
p = p->GetNextBrother();
return result;
template <class T>
TreeNode<T>* Tree<T>::FindData(const T& item, TreeNode<T>* t)
{
if (t == NULL)
return NULL;
if (t->GetData() == item)
return t;
else
{
TreeNode<T>* p = t->GetFirstChild();
TreeNode<T>* result = NULL;
while (p != NULL && (result = FindData(item, p)) != NULL)
p = p->GetNextBrother();
return result;
}
}
template <class T>
void Tree<T>::DeleTree(TreeNode<T>* t)
{
if (t != NULL)
{
TreeNode<T>* p = t->GetFirstChild(), *next;
while (p != NULL)
{
next = p->GetNextBrother();
DeleTree(p);
p = next;
}
delete p;
}
}
void Tree<T>::DeleTree(TreeNode<T>* t)
{
if (t != NULL)
{
TreeNode<T>* p = t->GetFirstChild(), *next;
while (p != NULL)
{
next = p->GetNextBrother();
DeleTree(p);
p = next;
}
delete p;
}
}
#endif
0 0
- 数据结构之树_Tree
- Flex组件_Tree树控件_动态图标树
- Flex组件_Tree树控件_动态增删数据
- ExtJS使用技巧_Tree
- React学习笔记_tree
- jquery-easyui学习(7)_tree
- 数据结构之树
- JAVA数据结构之树
- 数据结构之Trie树
- 数据结构之trie树
- 数据结构之【trie树】
- 数据结构之败者树
- 数据结构之Trie树
- 数据结构之二叉树
- 数据结构复习之【树】
- 数据结构之AVL树
- 数据结构之Trie树
- 数据结构之二叉树
- Codeforces 599 C. Day at the Beach
- php之输出缓存ob
- JVM调优
- 51nod 1038 矩阵取数问题 (DP)
- hibernate学习总结之子类关系映射
- 数据结构之树_Tree
- HDU 2586 最小公共祖先
- Python之自动化修改软件包版本号&日期
- Balanced Binary Tree
- rabbitMq:DIAGNOSTICS
- CentOS6.5安装MySQL5.7.9
- JVM内存管理
- Kibana User Guide [4.2] » Using Kibana in a Production Environment
- Android中的DrawRect()参数解析