【算法與數據結構】二叉樹的 先序 遍歷

 

一、二叉樹的構造函數

    二叉樹的構造採用遞歸方式spa

//二叉鏈表方式存儲的二叉樹結構
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); } } }

 

 

依次輸入以下:3d

 

構造的二叉樹以下:code

 

 

-------------------------------------------------------------------------------------------blog

 

  

二、二叉樹的先序遍歷遞歸

訪問二叉樹節點的代碼ci

//訪問二叉樹節點
void Visit(PBinaryTreeNode pNode) { cout<<"節點值爲:"<<pNode->value<<endl; }

 

2.1 遞歸方式it

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

//遞歸方式先序遍歷二叉樹
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; }
相關文章
相關標籤/搜索