左孩子,右兄弟,二叉樹存儲-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;
}