左孩子,右兄弟,二叉树存储-0-
#include <iostream>
using namespace std;
#include <stack>
#include <queue>
template<class T>
class TreeNode {
private:
T data;
TreeNode<T> *firstChild, *nextBrother;
public:
TreeNode(T value, TreeNode<T> *L = NULL, TreeNode<T> *R = NULL) {
data = value;
firstChild = L;
nextBrother = R;
}
TreeNode<T>* GetfirstChild() {
return firstChild;
}
void SetfirstChild(TreeNode<T>* L) {
firstChild = L;
}
TreeNode<T> * GetnextBrother() {
return nextBrother;
}
void SetnextBrother(TreeNode<T> * R) {
nextBrother = R;
}
T& Getdata() {
return data;
}
void Setdata(T value) {
data = value;
}
};
template<class T>
class Tree {
private:
TreeNode<T> *root;
public:
Tree(TreeNode<T>* item = NULL) {
root = item;
}
TreeNode<T> * Getroot() {
return root;
}
void Setroot(TreeNode<T>* item) {
root = item;
}
void Create(T stop_flag);
TreeNode<T>* CreateTree(T stop_flag);
TreeNode<T>* FindTarget(TreeNode<T>* t, T target); //在t为根节点的树中搜索值为target的节点
TreeNode<T>* FindFather(TreeNode<T>* t, TreeNode<T>* p); //在t为根节点的树中搜索p的父节点
TreeNode<T>* FirstChild(TreeNode<T>* p); //返回p节点的左孩子节点
TreeNode<T>* NextBrother(TreeNode<T>* p); //返回p节点的下一个兄弟节点
void DelSubTree(TreeNode<T>* t, TreeNode<T>* p); //在t为根节点的树中删除p为根节点的子树
void Del(TreeNode<T>* p); //
void PreOrder(TreeNode<T>* t); //先根、深搜
void LevelOrder(TreeNode<T>* t); //层次、广搜
void PreOrder_N(TreeNode<T>* t);
};
template<class T>
TreeNode<T>* Tree<T>::FindFather(TreeNode<T>* t, TreeNode<T>* p) {
if (t == NULL) {
return NULL;
}
TreeNode<T>* result = NULL;
TreeNode<T>* q = t->GetfirstChild();
while (q != NULL & q != p) {
result = FindFather(q, p);
if (!result) {
q = q->GetnextBrother();
} else {
return result;
}
}
if (q == p) {
return t;
} else
return NULL;
}
template<class T>
TreeNode<T>* Tree<T>::FindTarget(TreeNode<T>* t, T target) {
if (t == NULL) {
return NULL;
}
TreeNode<T>* result = NULL;
if (t->Getdata() == target) {
return t;
} else {
TreeNode<T>* q = t->GetfirstChild();
while (q != NULL && (result = FindTarget(q, target)) == NULL) {
q = q->GetnextBrother();
}
return result;
}
}
template<class T>
TreeNode<T>* Tree<T>::FirstChild(TreeNode<T>* p) {
if (p == NULL) {
cout << "搜索节点为空!" << endl;
return NULL;
}
if (p->GetfirstChild()) {
return p->GetfirstChild();
}
return NULL;
}
template<class T>
TreeNode<T>* Tree<T>::NextBrother(TreeNode<T>* p) {
if (p == NULL) {
cout << "搜索节点为空!" << endl;
}
if (p->GetnextBrother()) {
return p->GetnextBrother();
}
return NULL;
}
template<class T>
void Tree<T>::DelSubTree(TreeNode<T>* t, TreeNode<T>* p) {
if (t == NULL || p == NULL) {
cout << "根节点或p节点为空!" << endl;
return;
} else {
TreeNode<T> *q, *result;
result = FindFather(t, p);
if (result) {
if (result->GetfirstChild() == p) {
result->SetnextBrother(p->GetnextBrother());
Del(p);
return;
} else {
q = result->GetfirstChild();
while (q->GetnextBrother() != p) {
q = q->GetnextBrother();
}
q->SetnextBrother(p->GetnextBrother());
Del(p);
return;
}
} else {
if (t == p) {
cout << "t与p相同!" << endl;
return;
} else {
cout << "p不在以t为根的树中!" << endl;
return;
}
}
}
}
template<class T>
void Tree<T>::Del(TreeNode<T> *p) {
if (p != NULL) {
TreeNode<T> *q = p->GetfirstChild(), *next;
while (q != NULL) {
next = q->GetnextBrother();
Del(q);
q = next;
}
delete p;
}
return;
}
template<class T>
void Tree<T>::PreOrder(TreeNode<T>* t) {
if (t != NULL) {
cout << t->Getdata() << endl;
TreeNode<T>* child = FirstChild(t);
while (child) {
PreOrder(child);
child = NextBrother(child);
}
}
return;
}
template<class T>
void Tree<T>::LevelOrder(TreeNode<T> * t) {
if (t != NULL) {
queue<TreeNode<T>*> q;
TreeNode<T>* p;
q.push(t);
while (!q.empty()) {
p = q.front();
q.pop();
cout << p->Getdata() << endl;
p = p->GetfirstChild();
while (p != NULL) {
q.push(p);
p = p->GetnextBrother();
}
}
}
return;
}
template<class T>
void Tree<T>::PreOrder_N(TreeNode<T>* t) {
if (t != NULL) {
stack<TreeNode<T>*> s;
TreeNode<T>* p = t;
do {
while (p != NULL) {
cout << p->Getdata() << endl;
s.push(p);
p = p->GetfirstChild();
}
while (p == NULL && !s.empty()) {
p = s.top();
s.pop();
p = p->GetnextBrother();
}
} while (!s.empty());
}
return;
}
template<class T>
TreeNode<T>* Tree<T>::CreateTree(T stop_flag) {
TreeNode<T>* t, *t1, *t2;
T item;
cin >> item;
if (item == stop_flag) {
t = NULL;
return t;
} else {
if (!(t = new TreeNode<T>(item))) {
cout << "创建节点错误!" << endl;
return NULL;
}
t1 = CreateTree(stop_flag);
t->SetfirstChild(t1);
t2 = CreateTree(stop_flag);
t->SetnextBrother(t2);
return t;
}
}
template<class T>
void Tree<T>::Create(T stop_flag) {
root = CreateTree(stop_flag);
}
int main() {
Tree<int> *p = new Tree<int>;
TreeNode<int> *q;
p->Create(0);
q = p->Getroot();
p->PreOrder(q);
cout << "*************" << endl;
p->PreOrder_N(q);
cout << "*************" << endl;
p->LevelOrder(q);
cout << "*************" << endl;
TreeNode<int> * x;
x = p->FindTarget(q, 7);
cout << "11" << endl;
cout << x->Getdata() << endl;
;
x = p->FindFather(q, x);
cout << "11" << endl;
cout << x->Getdata() << endl;
p->DelSubTree(q, x);
cout << "!11" << endl;
p->LevelOrder(q);
return 0;
}