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


 

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; }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM