日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

二叉树家谱系统

發(fā)布時(shí)間:2024/3/24 windows 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树家谱系统 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

基本內(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é)

以上是生活随笔為你收集整理的二叉树家谱系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。