1、二叉樹的構造
二叉樹的構造采用遞歸方式
//二叉鏈表方式存儲的二叉樹結構
typedef struct _tagBinaryTreeNode { unsigned char value; struct _tagBinaryTreeNode* lchind; struct _tagBinaryTreeNode* rchild; }BinaryTreeNode, *PBinaryTreeNode;
//先序 遞歸方式初始化二叉樹
void InitBinaryTree(PBinaryTreeNode& pRoot) { cout << "請輸入節點的值,#表示空:"; unsigned char temp; cin >> temp; if (temp == '#') { pRoot = NULL; } else { if (NULL != (pRoot = new BinaryTreeNode())) { pRoot->value = temp; InitBinaryTree(pRoot->lchind); InitBinaryTree(pRoot->rchild); } else { exit(-1); } } }
依次輸入如下:

構造的二叉樹如下:

-------------------------------------------------------------------------------------------
2、二叉樹的先序遍歷
訪問二叉樹節點的代碼
//訪問二叉樹節點
void Visit(PBinaryTreeNode pNode) { cout<<"節點值為:"<<pNode->value<<endl; }
2.1 遞歸方式
先訪問根節點,然后訪問左子樹,再訪問右子樹
//遞歸方式先序遍歷二叉樹
void PreTraverse(PBinaryTreeNode pNode) { if (NULL == pNode) { return; } else { Visit(pNode); } PreTraverse(pNode->lchind); PreTraverse(pNode->rchild); }
運行結果:

2.2 非遞歸方式
非遞歸方式先序遍歷二叉樹的思想:
//非遞歸方式先序遍歷的思想:
首先將根節點入棧,如果棧為空退出
取棧頂元素,如果棧頂元素a為NULL,則棧頂元素a == NULL出棧,
再將此時的棧頂元素b出棧,然后將元素b的右子樹入棧,再次循環此過程;
/***************************************************************** //非遞歸方式先序遍歷二叉樹,第二個參數無意義,重載只表示非遞歸 //非遞歸方式先序遍歷的思想: 首先將根節點入棧,如果棧為空退出 取棧頂元素,如果棧頂元素a為NULL,則棧頂元素a == NULL出棧, 再將此時的棧頂元素b出棧,然后將元素b的右子樹入棧,再次循環此過程; ******************************************************************/
void PreTraverse(PBinaryTreeNode pNode, int nonRecurrence) { //存放元素的棧
stack<PBinaryTreeNode> stBT; //將棧頂元素入棧
stBT.push(pNode); while(! stBT.empty()) { PBinaryTreeNode topPNode = stBT.top(); //棧頂元素不為NULL,訪問此元素,並將其左子樹入棧
if (NULL != topPNode) { Visit(topPNode); stBT.push(topPNode->lchind); } //棧頂元素a為NULL,此元素a出棧,然后再將棧頂元素b出棧 //將元素b右子樹入棧
else { //將棧頂的為NULL的元素出棧
stBT.pop(); if (! stBT.empty()) { //取此時的棧頂元素,將其出棧並將其右子樹入棧
topPNode = stBT.top(); stBT.pop(); stBT.push(topPNode->rchild); } } } }
運行結果如下:

最后貼出man函數
int _tmain(int argc, _TCHAR* argv[]) { cout << "\r\n ------先序構造二叉樹,注意葉子節點的左右子樹為空,輸入#表示NULL--------\r\n"; PBinaryTreeNode pRoot = NULL; InitBinaryTree(pRoot); cout << "\r\n ----------先序構造二叉樹完畢 --------------\r\n\r\n"; cout << "\r\n -----------開始遞歸先序遍歷二叉樹 ------------\r\n"; PreTraverse(pRoot); cout << " --------------結束 遞歸先序遍歷二叉樹 ------------\r\n"; cout << "\r\n ----------開始 非遞歸 遍歷二叉樹--------------\r\n"; PreTraverse(pRoot, 0); cout << " --------------結束 非遞歸 遍歷二叉樹--------------\r\n"; return 0; }
