二叉樹的各種遍歷演算法

2021-05-27 08:54:44 字數 2276 閱讀 8774

typedef struct treenode

int data;

struct treenode *left;

struct treenode *right;

int flag;    //該標記用於後序非遞迴遍歷

}ptree;

/**************先序遞迴遍歷*****************/

void bt_preorder(ptree root)

if(root != null)

visit(root);     //訪問節點

bt_preorder(root->left);

bt_preorder(root->right);

/**************中序遞迴遍歷*****************/

void bt_midorder(ptree root)

if(root != null)

bt_midorder(root->left);

visit(root);     //訪問節點

bt_midorder(root->right);

/**************後序遞迴遍歷*****************/

void bt_beorder(ptree root)

if(root != null)

bt_beorder(root->left);

bt_beorder(root->right);

visit(root);     //訪問節點

/**************先序非遞迴遍歷*****************/

void bt_preordernorec(ptree root)

initstack(s);

whlie((root != null) || !s.empty())

if(root != null)

visit(root);   //訪問節點

s.push(root);

root = root->left;

else

root = s.pop();

root = root->right;

/**************中序非遞迴遍歷*****************/

void bt_midordernorec(ptree root)

initstack(s);

whlie((root != null) || !s.empty())

if(root != null)

s.push(root);

root = root->left;

else

root = s.pop();

visit(root);      //訪問節點

root = root->right;

/**************後序非遞迴遍歷*****************/

/*二叉樹後序遍歷的非遞迴遍歷演算法中,當當前節點存在右子樹的時候需要先遍歷右子樹

因此要對二叉樹的節點定義中新增flag域*/

void bt_beordernorec(ptree root)

initstack(s);

whlie((root != null) || !s.empty())

if(root != null)

s.push(root);

root = root->left;

else

root = s.top();       //top操作只是獲得棧頂的節點,該節點並不出棧

if(root->flag == 1)

visit(root);     //訪問節點

s.top();

root = null;

else

root->flag = 1;

root = root->right;

/**************層次遍歷*****************/

void bt_levelorder(ptree root)

initqueue q;

if(root == null)

return;

q.push(root);

while(!q.empty())

root = q.pop();

visit(root);   //訪問節點

if(root->left != null)

q.push(root->left);

if(root->right != null)

q.push(root->right);

二叉樹 各種遍歷演算法

include include include using namespace std 二叉樹結點 typedef struct bitnodebitnode,bitree 按先序序列建立二叉樹 int createbitree bitree t else return 0 輸出 void visi...

二叉樹遍歷的各種演算法

二叉樹的遍歷是指按照一定次序訪問二叉樹中的所有節點,且每個節點僅被訪問一次的過程。是最基本的運算,是其他運算的基礎。二叉樹有兩種儲存結構 順序儲存和鏈式儲存 順序儲存 對完全二叉樹來說,可以充分利用儲存空間,但對於一般的二叉樹,只有少數的儲存單元被利用 cpp view plain copy typ...

演算法之二叉樹各種遍歷

樹形結構是一類重要的非線性資料結構,其中以樹和二叉樹最為常用。二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作 左子樹 left subtree 和 右子樹 right subtree 二叉樹常被用作二叉查詢樹和二叉堆或是二叉排序樹。二叉樹的每個結點至多只有二棵子樹 不存在度大於2的結點 ...