二叉樹的非遞迴遍歷 先根遍歷 中根遍歷 後根遍歷

2021-09-17 02:58:42 字數 2231 閱讀 5353

本文** 

#include  

#include  

#include  

#include  

#include  

#include  

#include  

using namespace std;

typedef int elemtype;

#define nullptr null

typedef struct _treenode treenode, *searchbtree;

typedef searchbtree stackelemtype;

typedef struct stacknode *stack;

void initstack(stack st)        // 初始化棧,把頭節點看作是棧頂

int isempty(stack st)

void push(stack st, searchbtree x)      // 每次從將元素插入到頭節點的位置,頭節點上移

void pop(stack st)      // 出棧

searchbtree gettop(stack st)

searchbtree emptytree(searchbtree t)    // 初始化、構造一顆空樹/銷毀一顆樹

return nullptr;

}void insert(searchbtree &t, elemtype x)

else

}void preorderprint(searchbtree t)       // 先序根(序)遍歷二叉樹並列印出結點值

stack s = new stacknode;        // 借助棧來實現

initstack(s);

treenode* pt = t;       // 建立臨時結點指向根節點

while (pt || !isempty(s))           // 當結點不為空或者棧不為空執行迴圈

else

}cout << endl;

delete s;

}void inorderprint(searchbtree t)        // 中根(序)遍歷二叉樹並列印出結點值

stack s = new stacknode;        // 借助棧來實現

initstack(s);

treenode* pt = t;       // 建立臨時結點指向根節點

while (pt || !isempty(s))           // 當結點不為空或者棧不為空執行迴圈

else

}cout << endl;

delete s;

}void postorderprint(searchbtree t)      // 先根(序)遍歷二叉樹並列印出結點值

stack s = new stacknode;        // 借助棧來實現

initstack(s);

treenode* pt = t;       // 建立臨時結點指向根節點

treenode* qt = nullptr;

while (pt || !isempty(s))           // 當結點不為空或者棧不為空執行迴圈

else

else

// 當左孩子及根結點遍歷完之後,開始遍歷其右子樹}}

cout << endl;

delete s;

}int main()

;searchbtree mytree = new treenode;

mytree = emptytree(mytree);     // 初始化樹

for (int i = 0;i < sizeof(rawdata) / sizeof(elemtype);i++)

cout << "the inorder print of the tree is: \n";

inorderprint(mytree);

cout << "the preorder print of the tree is: \n";

preorderprint(mytree);

cout << "the postorder print of the tree is: \n";

postorderprint(mytree);

delete mytree;

system("pause");

return 0;

}

中根非遞迴遍歷二叉樹

在先根非遞迴中,根入棧後彈出,訪問,右孩子與左孩子進棧,順序很清楚。但是中根非遞迴與後根非遞迴中,根入棧後如果彈出不能訪問,這是乙個困惑的地方。為了更明晰地,更統一3種非遞迴設計思路。均可以採用入棧,彈出,左右子樹入棧這種基本步驟。每個步驟需要仔細在紙上演示設計。由於乙個節點出棧後還要進棧,該節點再...

二叉樹 非遞迴遍歷(先 中 後)

include include include define maxsize 20 最多結點個數 using namespace std 二叉鍊錶 typedef struct bnodebnode,btree 順序棧 typedef btree datatype typedef structseq...

二叉樹非遞迴先序遍歷

二叉樹的遞迴先序遍歷很簡單,假設二叉樹的結點定義如下 1 struct binarytreenode 2 遞迴先序遵循 根 左 右的順序 1 void preorder binarytreenode root 2非遞迴我們以乙個例子說明,仍然以之前博文的乙個二叉樹說明 1 82 36 104 55 ...