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

2021-08-18 14:49:44 字數 2168 閱讀 1573

常見的二叉樹的遍歷有三種方式:前序遍歷(根節點,左子樹,右子樹)

中序遍歷(左子樹,根節點,右子樹)

後序遍歷(左子樹,右子樹,根節點)

每種方式都可以用遞迴和非遞迴來實現

一、遞迴遍歷

1.先序遍歷:

先訪問根節點,再訪問左子樹,左子樹訪問完之後,訪問右子樹

void btreeprevorder(btnode* root)

2.中序遍歷:

先訪問左子樹,左子樹訪問完之後,訪問根節點,訪問右子樹

void btreeinorder(btnode* root)

3.後序遍歷:

先訪問左子樹,再訪問右子樹,最後訪問根節點

void btreepostorder(btnode* root)

btreepostorder(root->_left);

btreepostorder(root->_right);

printf("%d ", root->_data);

}

二叉樹遍歷的遞迴實現非常簡單

二、非遞迴遍歷(用棧來實現)

1.先序遍歷

首先列印根節點,將其入棧,判斷其左孩子是否為空,若不為空,列印左孩子,將其入棧,重複上述操作,直至左孩子為空。然後取出棧頂元素,將其右孩子當成根節點,重複上述操作。參照下圖進行理解。

}2.中序遍歷:

中序遍歷與先序遍歷過程較為相似,只需要改變printf的位置即可。

void btreeinordernonr(btnode* root)

top = stacktop(&s);

printf("%d ", top->_data);

stackpop(&s);

cur = top->_right;

} printf("\n");

}

3.後序遍歷:

後序遍歷只需要在中序遍歷的基礎上判斷其右子樹是否為空,或者是否已經被訪問過即可。

void btreepostordernonr(btnode* root)

top = stacktop(&s);

if (top->_right == null || top->_right == prev)

else

}printf("\n");

}

測試**:

void testbinarytree()

; size_t index = 0;

btnode* tree = createbtree(a, &index, '#');

printf("前序遍歷遞迴 :");

btreeprevorder(tree);

printf("\n");

printf("前序遍歷非遞迴:");

btreeprevordernonr(tree);

printf("中序遍歷遞迴 :");

btreeinorder(tree);

printf("\n");

printf("中序遍歷非遞迴:");

btreeinordernonr(tree);

printf("後序遍歷遞迴 :");

btreepostorder(tree);

printf("\n");

printf("後序遍歷非遞迴:");

btreepostordernonr(tree);

}

執行結果:

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

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

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

bst樹的節點型別 param class bstnode public t getdata public void setdata t data public bstnodegetleft public void setleft bstnodeleft public bstnodegetright...

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

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