普通树(有根树)C++

对于普通树实现的细节包括

1 树结点的结构体

2 初始化及删除树结点(关注内存泄露)

3 递归先序遍历

4 通过关键值的查询操作,返回关键值的结点

5 凹入表实现

6 广义表实现

7 非递归先序遍历,利用栈作为辅助的数据结构

  1 #include <iostream>
  2 #include <crtdbg.h>
  3 #include <cstring>
  4 #include <assert.h>
  5 using namespace std;
  6 
  7 typedef int DataType;
  8 struct TreeNode
  9 {
 10     TreeNode()
 11     {
 12         sibling = NULL;
 13         child = NULL;
 14     }
 15     DataType data;
 16     TreeNode * sibling; //右兄弟结点
 17     TreeNode * child;   //左子结点
 18 };
 19 typedef TreeNode *DataStack; // 存储类型为 TreeNode*
 20 //普通树
 21 class Tree
 22 {
 23 private:
 24     TreeNode *root;
 25     Tree(const Tree &) {}//防止拷贝构造 与 赋值
 26     Tree & operator=(const Tree &) { return *this; }
 27 public:
 28     Tree(const DataType &data);
 29     ~Tree();
 30     const TreeNode * GetRoot()const { return root;}
 31     TreeNode * GetRoot() { return root;}
 32     void Init(const DataType &data);
 33     void Destroy(TreeNode * p);//删除根结点
 34     void DestroySub(TreeNode * p);//删除子结点;
 35     TreeNode * InsertChild(TreeNode *p, DataType data);
 36     TreeNode * InsertSibling(TreeNode *p, DataType data);
 37     void Print(const TreeNode * p); //先序遍历
 38     TreeNode *  Find(TreeNode * p, DataType data);//寻找data返回并返回结点
 39     void Print2(); //非递归先序遍历
 40 };
 41 //辅助类栈
 42 class Stack
 43 {
 44 private:
 45     struct Node
 46     {
 47         DataStack data;
 48         Node *next;
 49     };
 50     Node * head;
 51     void Init()
 52     {
 53         head = NULL;
 54     }
 55     void Destroy()
 56     {
 57         for (Node* p = head; p != NULL;)
 58         {
 59             Node *pTemp = p->next;
 60             delete p ;
 61             p = pTemp;
 62         }
 63         head = NULL;
 64     }
 65 public:
 66     Stack()
 67     {
 68         Init();
 69     }
 70     ~Stack()
 71     {
 72         Destroy();
 73     }
 74     void Push(DataStack  data)
 75     {
 76         Node *p = new Node;
 77         p->data = data;
 78         p->next = head;
 79         head = p;
 80     }
 81     DataStack Pop()
 82     {
 83         if (head == NULL)
 84         {
 85             return NULL;
 86         }
 87         Node *p = head;
 88         DataStack temp = p->data;
 89         head = head->next;
 90         delete p;
 91         p = NULL;
 92         return temp;
 93     }
 94     int Getlenth()
 95     {
 96         int n = 0;
 97         for (Node *p = head; p != NULL; p = p->next)
 98         {
 99             ++n;
100         }
101         return n;
102     }
103     DataStack Getop()
104     {
105         if (head == NULL)
106         {
107             return NULL;
108         }
109         return head->data;
110     }
111     bool Empty()
112     {
113         return (head == NULL);
114     }
115 };
116 //普通树方法实现
117 Tree::Tree(const DataType &data) 
118 {
119     Init(data);
120 }
121 Tree::~Tree () 
122 { 
123     Destroy(root);
124 }
125 void Tree::Init(const DataType &data)
126 {
127     root = new TreeNode;
128     root->child = NULL;
129     root->sibling = NULL;
130     root->data = data;
131 }
132 void Tree::Destroy(TreeNode * p)
133 {
134     if (p == NULL)
135     {
136         return;
137     }
138     Destroy(p->sibling);
139     Destroy(p->child);
140     delete p;
141     p = NULL;
142 }
143 void Tree::DestroySub(TreeNode * p)
144 {
145     if (p->child)
146     {
147         Destroy(p->child);
148         p->child = NULL;
149     }
150 }
151 TreeNode * Tree::InsertChild(TreeNode * p, DataType data)
152 {
153     if (p->child)
154     {
155         return p->child; //已有子结点
156     }
157     TreeNode *pNew = new TreeNode;
158     pNew->data = data;
159     p->child = pNew;
160     return pNew;
161 }
162 TreeNode * Tree::InsertSibling(TreeNode * p, DataType data)
163 {
164     if (p->sibling) 
165     {
166         return p->sibling;//已有兄弟结点
167     }
168     TreeNode *pNew = new TreeNode;
169     pNew->data = data;
170     p->sibling = pNew;
171     return pNew;
172 }
173 //先序遍历
174 void  Tree::Print(const TreeNode * p)
175 {
176     if(p==NULL)
177     {
178         return;
179     }
180     cout << p->data << endl;
181     Print(p->child);
182     Print(p->sibling);
183 }
184 //寻找data并返回结点
185  TreeNode *  Tree::Find(TreeNode * p, DataType data)
186 {
187     if(p == NULL)
188         return NULL;
189     if (p->data == data)
190     {
191         return p;
192     }
193     TreeNode *pFind = Find(p->child, data);
194     if (pFind != NULL)
195     {    
196         return pFind;
197     }
198 
199     return Find(p->sibling, data);
200 }
201 //非递归先序遍历
202 void Tree::Print2()
203 {
204     TreeNode *p = GetRoot();
205     if (p == NULL)
206     {
207         return;
208     }
209     Stack stack;
210     
211     while( (p != NULL) || (!stack.Empty()) )
212     {
213         if (p != NULL)
214         {
215             cout << p->data << endl;
216             stack.Push(p);
217             p = p->child;
218         }
219         else
220         {
221              p = stack.Pop();
222              p = p->sibling;
223         }
224     }
225 }
226 void AoRuBiao(const TreeNode *p, int depth)
227 {
228     if (p == NULL)
229     {
230         return;
231     }
232     for (int i=0; i<depth; ++i)
233     {
234         cout << " ";
235     }
236     cout << p->data;
237     for (int i=0; i<10-depth; ++i)
238     {
239         cout << " - ";
240     }
241     cout << endl;
242     AoRuBiao(p->child, depth+1);
243     AoRuBiao(p->sibling, depth);
244 }
245 void GuangYiBiao(const TreeNode *p)
246 {
247     if (p == NULL)
248     {
249         return;
250     }
251     cout << p->data;
252     if (p->child)
253     {
254         cout << "(";
255     }
256     GuangYiBiao(p->child);
257     if (p->child)
258     {
259         cout << ")";
260     }
261     if (p->sibling)
262     {
263         cout << ",";
264     }
265     GuangYiBiao(p->sibling);
266 }
267 
268 void main()
269 {
270     _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
271 
272     Tree tree(10);
273 
274     //Stack s;
275     //s.Push(tree.GetRoot());
276     //cout << s.Getop()->data;
277 
278     TreeNode * p11 = tree.InsertChild(tree.GetRoot(), 11);
279     TreeNode * p12 = tree.InsertSibling(p11,12);
280     TreeNode * p13 = tree.InsertSibling(p12,13);
281 
282     TreeNode * p111 = tree.InsertChild(p11, 111);
283     TreeNode * p112 = tree.InsertSibling(p111,112);
284 
285     TreeNode * p121 = tree.InsertChild(p12, 121);
286     TreeNode * p122 = tree.InsertSibling(p121,122);
287 
288     tree.Print(tree.GetRoot());
289     //tree.DestroySub(p12);
290     //tree.Print(tree.GetRoot());
291     cout << "\n\nSearch p12" << endl;
292     TreeNode * temp = tree.Find(tree.GetRoot(),12);
293     if (temp != NULL)
294     {
295         cout << temp->child->data <<endl;
296         cout << temp->sibling->data << endl;
297     }
298 
299     cout << "\n\nAoRuBiao " << endl;
300     AoRuBiao(tree.GetRoot(),1);
301     
302     cout << "\nGuangYiBiao" << endl;
303     GuangYiBiao(tree.GetRoot());
304 
305     cout << "\n\n非递归遍历" << endl;
306     tree.Print2();
307 
308     system("pause");
309 } 

 

(转载请注明作者和出处^_*  Seven++ http://www.cnblogs.com/sevenPP/  )

 

posted on 2014-04-18 01:49  Seven++  阅读(3150)  评论(0编辑  收藏  举报

导航