您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關C++中基于遞歸和非遞歸算法如何求二叉樹鏡像,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
具體如下:
/*求二叉樹鏡像 -- 采用遞歸和非遞歸方法 經調試可運行源碼及分析如下: ***/ #include <stdlib.h> #include <iostream> #include <queue> using std::cout; using std::cin; using std::endl; using std::queue; /*二叉樹結點定義*/ typedef struct BTreeNode { char elem; struct BTreeNode *pleft; struct BTreeNode *pright; }BTreeNode; /* 求二叉樹鏡像 遞歸方式步驟: 如果proot為NULL,則為空樹,返回; 如果proot不為NULL,交換proot左右結點,然后分別求左右子樹的鏡像; */ /*遞歸求二叉樹鏡像*/ 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 ; } /* 非遞歸方式步驟如下: 借助隊列 首先,將根節點proot入隊; 第一步:當隊列非空時,獲取當前層次的節點總數,即當前隊列的長度;執行第二步; 第二步:按照當前層的節點總數,出隊進行遍歷節點,在遍歷時, 交換左右節點,如果左右節點存在,則入隊; 當遍歷完當前層所有節點時,遍歷下一層,執行第一步。 */ 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(); //交換左右子節點 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 ; } /*初始化二叉樹根節點*/ BTreeNode* btree_init(BTreeNode* &bt) { bt = NULL; return bt; } /*先序創建二叉樹*/ 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);//初始化根節點 pre_crt_tree(bt);//創建二叉樹 cout << "先序遍歷輸出如下:" << endl; cout << "調用鏡像函數前:" << endl; pre_order_traverse(bt); cout << endl; get_bitree_mirror(bt); cout << "遞歸調用鏡像函數后:" << endl; pre_order_traverse(bt); cout << endl; cout << "非遞歸調用鏡像函數后:" << endl; get_bitree_mirror_leveltraverse(bt); pre_order_traverse(bt); cout << endl; system("pause"); return 0; }
/* 運行結果: a b c # # # d e # # # ------以上為輸入----------- ------以下為輸出----------- 先序遍歷輸出如下: 調用鏡像函數前: a b c d e 遞歸調用鏡像函數后: a d e b c 非遞歸調用鏡像函數后: a b c d e 請按任意鍵繼續. . . --------------------------------- 本例創建的二叉樹形狀: a b d c e 調用遞歸求二叉樹鏡像形狀: a d b e c 再次調用非遞歸求二叉樹鏡像形狀(即鏡像的鏡像): a b d c e */
關于“C++中基于遞歸和非遞歸算法如何求二叉樹鏡像”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。