詳解二叉樹的後序遍歷

2021-10-03 03:49:36 字數 1955 閱讀 5820

後序遍歷的遞迴演算法

思路:

遍歷左子樹

遍歷右子樹

訪問根節點

**如下:

//二叉樹的後序遍歷(遞迴)

void

binarytreepostorder

(btnode* root)

}

後序遍歷的非遞迴演算法

思路:

借助棧來實現

傳入二叉樹根節點

從當前節點開始遍歷左子樹,將所有的節點入棧,且清空lt標記,直至左子樹為空

訪問棧頂,將其lt置位為1,訪問他的右子樹(如果右子樹存在,返回至步驟2,如果右子樹不存在,則繼續執行)

取出棧頂並列印(出棧),通過檢測他的父節點的lt是否也被置位為1(如果是,則一直列印並出棧,直到找到乙個lt標記為清空狀態的節點位置,返回至步驟2)

**後續遍歷的非遞迴演算法

**如下:

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

void

binarytreepostordernonr

(btnode* root)

while(!

stackisempty

(&st)

&& tag[st.size -1]

)//前面的條件只在最後一次迴圈跳出的時候生效

//後面的條件分兩個情況:

//1、當cur為空時,上面的for不進,此條件成立

//2、當cur不為空,上面的for進,則此條件不成立

//如果檢測到當前的lt被置位(也就是情況1),那麼在列印完當前節點後,再去直接檢查上乙個節點(父節點)是不是也要被列印了(lt置位,證明這是它的右子樹,它也要被列印了),所以要用while迴圈列印if(

!stackisempty

(&st)

)//此條件只在最後一次迴圈跳出時生效

}while(!

stackisempty

(&st));

//由於後序遍歷中根節點是最後出棧的,所以在根節點出棧前,棧不可能為空

//所以以棧是否為空來判定是否要跳出

stackdestory

(&st)

;}

棧函式實現如下:

typedef

char btdatatype;

// 二叉鏈的結構體

typedef

struct binarytreenode btnode;

typedef btnode* stdatatype;

// 棧的結構體

typedef

struct stack stack;

void

stackinit

(stack* psl, size_t capicity)

void

stackdestory

(stack* psl)

}void

checkcapacity

(stack* psl)

}void

stackpush

(stack* psl, stdatatype x)

void

stackpop

(stack* psl)

stdatatype stacktop

(stack* psl)

return psl->array[psl->size -1]

;}intstackisempty

(stack* psl)

二叉樹的後序遍歷

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

二叉樹的後序遍歷

節點和樹類 public class treenode public treenode integer val override public string tostring public class tree 遞迴實現 public arraylistafter treenode node aft...

二叉樹的後序遍歷

如下圖表示一顆二叉樹,對它進行先序遍歷操作,採用兩種方法,遞迴和非遞迴操作。遍歷結果為 4526731。1 遞迴操作 思想 若二叉樹為空,返回。否則 1 後序遍歷右子樹 2 後序遍歷左子樹 3 遍歷根節點 void postorder bitree root 2 非遞迴操作 void postord...