C++基于遞歸和非遞歸算法求二叉樹鏡像的方法
更新時(shí)間:2017年05月11日 14:30:51 作者:難免有錯(cuò)_
這篇文章主要介紹了C++基于遞歸和非遞歸算法求二叉樹鏡像的方法,針對(duì)二叉樹遍歷結(jié)合實(shí)例形式分析了遞歸與非遞歸算法的實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下
本文實(shí)例講述了C++基于遞歸和非遞歸算法求二叉樹鏡像的方法。分享給大家供大家參考,具體如下:
/*求二叉樹鏡像 -- 采用遞歸和非遞歸方法 經(jīng)調(diào)試可運(yùn)行源碼及分析如下: ***/ #include <stdlib.h> #include <iostream> #include <queue> using std::cout; using std::cin; using std::endl; using std::queue; /*二叉樹結(jié)點(diǎn)定義*/ typedef struct BTreeNode { char elem; struct BTreeNode *pleft; struct BTreeNode *pright; }BTreeNode; /* 求二叉樹鏡像 遞歸方式步驟: 如果proot為NULL,則為空樹,返回; 如果proot不為NULL,交換proot左右結(jié)點(diǎn),然后分別求左右子樹的鏡像; */ /*遞歸求二叉樹鏡像*/ void get_bitree_mirror(BTreeNode* proot) { if (proot == NULL) return ; BTreeNode* temp_node = proot->pleft; proot->pleft = proot->pright; proot->pright = temp_node; get_bitree_mirror(proot->pleft); get_bitree_mirror(proot->pright); return ; } /* 非遞歸方式步驟如下: 借助隊(duì)列 首先,將根節(jié)點(diǎn)proot入隊(duì); 第一步:當(dāng)隊(duì)列非空時(shí),獲取當(dāng)前層次的節(jié)點(diǎn)總數(shù),即當(dāng)前隊(duì)列的長(zhǎng)度;執(zhí)行第二步; 第二步:按照當(dāng)前層的節(jié)點(diǎn)總數(shù),出隊(duì)進(jìn)行遍歷節(jié)點(diǎn),在遍歷時(shí), 交換左右節(jié)點(diǎn),如果左右節(jié)點(diǎn)存在,則入隊(duì); 當(dāng)遍歷完當(dāng)前層所有節(jié)點(diǎn)時(shí),遍歷下一層,執(zhí)行第一步。 */ void get_bitree_mirror_leveltraverse(BTreeNode* proot) { if(proot == NULL) return ; queue <BTreeNode*> que; que.push(proot); int level_nodes_number = 0; while (!que.empty())//層次遍歷 { level_nodes_number = que.size(); int level_count = 0; while (level_count < level_nodes_number) { ++level_count; proot = que.front(); que.pop(); //交換左右子節(jié)點(diǎn) BTreeNode* temp_node = proot->pleft; proot->pleft = proot->pright; proot->pright = temp_node; if(proot->pleft != NULL) que.push(proot->pleft); if(proot->pright != NULL) que.push(proot->pright); } } return ; } /*初始化二叉樹根節(jié)點(diǎn)*/ BTreeNode* btree_init(BTreeNode* &bt) { bt = NULL; return bt; } /*先序創(chuàng)建二叉樹*/ void pre_crt_tree(BTreeNode* &bt) { char ch; cin >> ch; if (ch == '#') { bt = NULL; } else { bt = new BTreeNode; bt->elem = ch; pre_crt_tree(bt->pleft); pre_crt_tree(bt->pright); } } /*先序遍歷*/ void pre_order_traverse(BTreeNode* proot) { if(proot == NULL) return; cout<< proot->elem << " "; pre_order_traverse(proot->pleft); pre_order_traverse(proot->pright); return; } int main() { int tree_node_number = 0; BTreeNode *bt; btree_init(bt);//初始化根節(jié)點(diǎn) pre_crt_tree(bt);//創(chuàng)建二叉樹 cout << "先序遍歷輸出如下:" << endl; cout << "調(diào)用鏡像函數(shù)前:" << endl; pre_order_traverse(bt); cout << endl; get_bitree_mirror(bt); cout << "遞歸調(diào)用鏡像函數(shù)后:" << endl; pre_order_traverse(bt); cout << endl; cout << "非遞歸調(diào)用鏡像函數(shù)后:" << endl; get_bitree_mirror_leveltraverse(bt); pre_order_traverse(bt); cout << endl; system("pause"); return 0; }
/* 運(yùn)行結(jié)果: a b c # # # d e # # # ------以上為輸入----------- ------以下為輸出----------- 先序遍歷輸出如下: 調(diào)用鏡像函數(shù)前: a b c d e 遞歸調(diào)用鏡像函數(shù)后: a d e b c 非遞歸調(diào)用鏡像函數(shù)后: a b c d e 請(qǐng)按任意鍵繼續(xù). . . --------------------------------- 本例創(chuàng)建的二叉樹形狀: a b d c e 調(diào)用遞歸求二叉樹鏡像形狀: a d b e c 再次調(diào)用非遞歸求二叉樹鏡像形狀(即鏡像的鏡像): a b d c e */
希望本文所述對(duì)大家C++程序設(shè)計(jì)有所幫助。
您可能感興趣的文章:
- C++ 非遞歸實(shí)現(xiàn)二叉樹的前中后序遍歷
- C++ 數(shù)據(jù)結(jié)構(gòu)二叉樹(前序/中序/后序遞歸、非遞歸遍歷)
- C++使用遞歸和非遞歸算法實(shí)現(xiàn)的二叉樹葉子節(jié)點(diǎn)個(gè)數(shù)計(jì)算方法
- C++基于遞歸和非遞歸算法判定兩個(gè)二叉樹結(jié)構(gòu)是否完全相同(結(jié)構(gòu)和數(shù)據(jù)都相同)
- C++非遞歸隊(duì)列實(shí)現(xiàn)二叉樹的廣度優(yōu)先遍歷
- C++非遞歸建立二叉樹實(shí)例
- C++二叉樹的前序中序后序非遞歸實(shí)現(xiàn)方法詳細(xì)講解
相關(guān)文章
關(guān)于C++虛函數(shù)與靜態(tài)、動(dòng)態(tài)綁定的問題
這篇文章主要介紹了C++虛函數(shù)與靜態(tài)、動(dòng)態(tài)綁定,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10使用設(shè)計(jì)模式中的單例模式來實(shí)現(xiàn)C++的boost庫(kù)
這篇文章主要介紹了使用設(shè)計(jì)模式中的單例模式來實(shí)現(xiàn)C++的boost庫(kù)的方法,其中作者對(duì)線程安全格外強(qiáng)調(diào),需要的朋友可以參考下2016-03-03C語言用棧和隊(duì)列實(shí)現(xiàn)的回文檢測(cè)功能示例
這篇文章主要介紹了C語言用棧和隊(duì)列實(shí)現(xiàn)的回文檢測(cè)功能,結(jié)合具體實(shí)例形式分析了C語言棧和隊(duì)列的定義及使用棧和隊(duì)列進(jìn)行回文檢測(cè)的操作技巧,需要的朋友可以參考下2017-06-06C語言動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn)
本文主要介紹了C語言動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08