C 非遞迴實現前中後序遍歷二叉樹

2022-06-26 13:30:13 字數 2342 閱讀 6389

目錄具體實現

網上**一搜一大片,大同小異咯。

書上的函式實現**甚至更勝一籌,而且抄一遍就能用,唯一問題是沒有寫二叉樹節點和樹的模版類的構造實現,和沒有具體實現 visit 函式(也沒說明,略坑)。

只需要前中後序遍歷的話很多函式都不需要,此外值得吐槽的一點是,明明 binarytreenode 類裡面介面寫的很明確,私有成員也都保護起來了,最後卻把 binarytree 新增為了友元類,這波操作著實令人費解。

為了新增這個友元類還需要先進行兩個類的宣告,之後才能逐個實現,迷了。

但這都不是我按順序實現了介面函式,最後還是沒有呼叫介面函式的理由。所以根本原因其實就是懶。

四種遍歷方法分別為:

層次遍歷使用了佇列進行實現,而前中後序遍歷是利用的棧來實現。而前序遍歷、中序遍歷和後序遍歷中,後序遍歷的實現無疑是最複雜的。

直接上頭檔案,需要注意的是我沒有實現建樹、刪樹和插入的函式,順手還多抄了乙個層次遍歷的函式。整體來看是乙個很菜的**,只在主函式裡隨便構了乙個二叉樹測試遍歷函式。

全部都是模版類的實現寫起來很麻煩,實現好了很舒服23333

templateclass binarytreenode;

templateclass binarytree;

templateclass binarytreenode;

templateclass binarytree;

#include"binarytree.h"

#include#include#includetemplatebinarytreenode::binarytreenode()

templatebinarytreenode::binarytreenode(t& ele)

templatebinarytreenode::binarytreenode(t& ele, binarytreenode* l,

binarytreenode* r)

templatebinarytreenode* binarytreenode::getleftchild()

templatebinarytreenode* binarytreenode::getrightchild()

templatet binarytreenode::getvalue() const

templatebool binarytreenode::setleftchild(binarytreenode* l)

else return false;

}templatebool binarytreenode::setrightchild(binarytreenode* r)

else return false;

}templatebool binarytreenode::isleaf() const

templatebinarytree::binarytree()

templatebinarytree::binarytree(binarytreenode* r)

templatebinarytree::~binarytree()

templatebool binarytree::isempty() const

templatebinarytreenode* binarytree::getroot() const

templatevoid binarytree::visit(binarytreenode* pointer)

else }}

templatevoid binarytree::inorder(binarytreenode* root)

else }}

templatevoid binarytree::postorder(binarytreenode* root)

while(pointer != nullptr && (pointer -> rightchild == nullptr ||

pre == pointer->rightchild))

nodestack.push(pointer);

pointer = pointer -> rightchild; }}

templatevoid binarytree::levelorder(binarytreenode* root)

}

#include"binarytree.h"

#include using namespace std;

int main()

非遞迴前,中,後序遍歷二叉樹

相比遞迴遍歷二叉樹,非遞迴遍歷二叉樹稍難一些,而又數非遞迴後序遍歷二叉樹更難。在我通過與這段時間所學資料結構相結合,學習和了解了非遞迴遍歷二叉樹的方法,這裡三種遍歷方式都會用到棧,利用棧的逐層壓棧與先進後出的特點,類似於用 實現了遞迴遍歷二叉樹的基本方法。非遞迴二叉樹的遍歷個人認為注重的是思想,實現...

二叉樹的前中後序遍歷(遞迴 非遞迴)

二叉樹節點類 author wj class treenode 二叉樹類 author wj class binarytree private void add node to tree int value 建立二叉樹 treenode currentnode treenode while true...

二叉樹的前中後序非遞迴遍歷

前序遍歷最簡單,無腦入棧無腦出棧,出棧的時候先入右再入左即可。class solution stack.push root while stack.size 0 if temp.left null return res 中序遍歷比較特殊,要有乙個前驅指標p來一直向左試探,所以條件上多了一項p nul...