利用棧實現二叉樹的後序遍歷演算法

2021-07-04 09:12:57 字數 1181 閱讀 6987

二叉樹的後序遍歷演算法是按照左子樹->右子樹->節點的訪問順序來遍歷二叉樹的。所以需要將節點依次入棧,然後分別找到他們的左子樹和右子樹。而且在右子樹沒有被訪問完之前,節點要一直在棧中。所以,當我們訪問左子樹後根據節點去訪問右子樹,而當右子樹訪問完後訪問節點退棧,兩次訪問節點結果卻不相同,如下圖:

乙個是訪問節點後去訪問右子樹,乙個是訪問節點後退棧訪問上乙個節點的右子樹如果不做任何處理,那麼會在右子樹訪問後形成死迴圈,所以應新增乙個標緻位標緻訪問節點時應訪問的位置(先序遍歷和中序遍歷並不需要,因為他們在訪問右子樹之前就已經將節點出棧了)。

首先定義棧元素型別:

typedef struct selemtype;    // 棧的元素型別

二叉樹節點型別:

typedef struct bitnode bitnode, *bitree;

棧的操作函式,自己實現,此處不再贅敘。主要有:

status initstack(stack &s); //初始化棧

status stackempty(stack s); //判斷棧是否為空,這是後序遍歷是否完成的標緻

status push(stack &s, selemtype e);//入棧

status pop(stack &s, selemtype &e); //出棧

status gettop(stack s, selemtype &e); //得到棧頂元素,棧頂元素並不出棧

演算法實現主要思想:

先到最左下角的元素,然後判斷它是否有右子樹,若是則將它的標緻域標為1,並重複上面步驟,把指標移向它的右子樹最左下角的元素,直到最左下角元素沒有了右子樹後訪問他,並判斷它的上乙個節點有沒有右子樹,若有,將它的上乙個節點的標緻域置為1並將指標指向它的右子樹,重複上面步驟。若沒有則訪問這個節點直到它上乙個有了右子樹為止或棧空,遍歷完成,退出迴圈。

後序遍歷**:

void postorder(bitree t, void (*visit)(telemtype))

/* 使用棧,非遞迴後序遍歷二叉樹t,     */

/* 對每個結點的元素域data呼叫函式visit */

if(st->ptr->rchild)

else

}pop(s,a);

a.tag = 1;

push(s,a);

st->ptr = st->ptr->rchild;}}

}

二叉樹後序遍歷演算法實現

對於二叉樹的三種遍歷方式,它們的難易程度是不一樣的,最簡單的是先序遍歷,其次是中序遍歷,最難的是後序遍歷方式。但是最難的後序遍歷方式,卻可以通過最簡單的先序遍歷方式的變形實現,然後把遍歷的結果逆序一下就搞定了。哈哈,物極必反啊!先看乙個最簡單的後序的遍歷方法的實現,利用先序遍歷方式的變形,然後逆序 ...

演算法求二叉樹後序遍歷

演算法原題來自 hihocoder 題目要求使用樹的前序遍歷和中序遍歷求出樹的後序遍歷串。那麼我們想到的方法便是根據前序遍歷和中序遍歷求出這棵樹,那麼就可以很容易的後序遍歷此樹了。根據題目我們先來定義樹節點的資料結構 typedef struct nodenode t 那麼我們可以這樣設定這個函式 ...

二叉樹的後序遍歷

1 問題描述 給出一棵二叉樹,返回其節點值的後序遍歷。給出一棵二叉樹 1 2 3返回 3,2,1 2 問題實現 與前序遍歷 中序遍歷類似。若二叉樹為空,則空操作返回。否則後序遍歷根節點的左子樹,後序遍歷根節點的右子樹,訪問根節點。3 definition of treenode class tree...