二叉树家谱系统
基本內(nèi)容
實(shí)驗(yàn)內(nèi)容:基于二叉樹(shù)來(lái)存儲(chǔ)家譜關(guān)系,同時(shí)實(shí)現(xiàn)1.后序遞歸遍歷算法。2.前序非遞歸遍歷算法。3.輸入指定人物代號(hào),查詢其所有長(zhǎng)輩的功能。
首先需要將要存儲(chǔ)的族譜轉(zhuǎn)化為輸入的字符串,再通過(guò)輸入的字符串創(chuàng)建族譜二叉樹(shù)。
規(guī)定輸入形式為括號(hào)表達(dá)式:A(B(C,D(,E)),)
其表示的樹(shù)為
程序架構(gòu)
主程序
首先輸入括號(hào)表達(dá)式,然后通過(guò)該括號(hào)表達(dá)式,初始化一個(gè)樹(shù),隨后調(diào)用前序遍歷非遞歸函數(shù),后序遍歷遞歸函數(shù),以及輸入一個(gè)人物代號(hào),找到其所有長(zhǎng)輩,驗(yàn)證程序的正確性。
樹(shù)模板類
- 二叉樹(shù)的建立
- 分析:樹(shù)的每個(gè)節(jié)點(diǎn)包含三個(gè)域,一個(gè)數(shù)據(jù)域,一個(gè)指向左孩子的指針,一個(gè)指向右孩子的指針。包含一個(gè)節(jié)點(diǎn)指針變量,指向根節(jié)點(diǎn)。
- 通過(guò)輸入的括號(hào)表達(dá)式,逐個(gè)字符判斷,若遇到左括號(hào),表示下一個(gè)遇到的字符為左孩子,則k=1,同時(shí)表示該節(jié)點(diǎn)擁有子節(jié)點(diǎn),則將該節(jié)點(diǎn)入棧;若遇到逗號(hào),表示下一個(gè)遇到的字符為右孩子,則k=2;若遇到右括號(hào)表示該塊讀取完成。若讀取為字符,則通過(guò)k的值,添加棧頂?shù)墓?jié)點(diǎn)左右孩子節(jié)點(diǎn)。
- template<typename T> void BTree<T>::init(T c[]) {char ch;BNode<T> *stack[MaxSize], *p;int top = -1, k = 0, j = 0;while ((ch = c[j++]) != '\0') {switch (ch) {case '(': {top++;stack[top] = p;k = 1;break;}case ',': {k = 2;break;}case ')': {top--;break;}default: {p = new BNode<T>;p->data = ch;p->lchild = p->rchild = NULL;if (this->b == NULL) {this->b = p;} else {switch (k) {case 1:stack[top]->lchild = p;break;case 2:stack[top]->rchild = p;break;}}}}} }
- 后序遍歷遞歸算法
- template<typename T> void BTree<T>::PostOrderRe(BNode<T> *b) {if (b != NULL) {PostOrderRe(b->lchild);PostOrderRe(b->rchild);cout << b->data << " ";} }
- 前序遍歷非遞歸算法
- 非遞歸實(shí)現(xiàn),則使用棧來(lái)存儲(chǔ)遍歷過(guò)的父節(jié)點(diǎn)。
- template<typename T> void BTree<T>::PreOrderNotRe() {cout << "先序遍歷非遞歸算法輸出為:";BNode<T> *stack[MaxSize];BNode<T> *p = this->b;int top = -1;while (p != NULL || top != -1) {if (p != NULL) {cout << p->data << " ";top++;stack[top] = p;p = p->lchild;} else {p = stack[top];top--;p = p->rchild;}}cout << endl; }
-
得到要查詢?nèi)宋锏乃凶嫦?/p>
-
通過(guò)定義flag標(biāo)志,查詢是否找到了該被查詢?nèi)宋铩Mㄟ^(guò)遞歸后序遍歷查詢,若查詢到了,則令flag=1,而回溯時(shí),flag==1,則輸出該節(jié)點(diǎn),即為被查詢?nèi)宋镒嫦?/p>
- template<typename T> void BTree<T>::FindAllAncestor(BNode<T> *b, char object) {if (b != NULL) {FindAllAncestor(b->lchild, object);FindAllAncestor(b->rchild, object);if (flag == 1) {cout << b->data << " ";}if (b->data == object) flag = 1;} }
-
程序驗(yàn)證
?
?
總結(jié)
- 上一篇: linux shell 生成图片,she
- 下一篇: 快鲸租赁管理系统能实现哪些功能?