二叉樹遍歷之中序遍歷(原始碼)
阿新 • • 發佈:2019-02-17
二叉樹的中序遍歷
- 要點:
1.中序遍歷左子樹
2.訪問根節點
3.中序遍歷右子樹 例項: 如圖:中序遍歷結果:DBEAFC
中序遍歷的時間複雜度為:O(n)。
如果一棵二叉排序樹的節點值是數值,中序遍歷的結果為升序排列的陣列。可以利用該性質檢測一棵樹是否為二叉排序數。
已知前序遍歷和後序遍歷,不能確定唯一的中序遍歷
計算中序遍歷擁有比較簡單直觀的投影法,如圖
3.typedef struct TreeNode { int data; struct TreeNode *left; struct TreeNode *right; struct TreeNode *parent; } TreeNode; void middle_order(TreeNode *Node) { if(Node != NULL) { middle_order(Node->left); printf("%d ", Node->data); middle_order(Node->right); } }
4.非遞迴實現:
根據中序遍歷的順序,對於任一結點,優先訪問其左孩子,而左孩子結點又可以看做一根結點,然後繼續訪問其左孩子結點,直到遇到左孩子結點為空的結點才進行訪問,然後按相同的規則訪問其右子樹。因此其處理過程如下:對於任一結點P,
1)若其左孩子不為空,則將P入棧並將P的左孩子置為當前的P,然後對當前結點P再進行相同的處理;
2)若其左孩子為空,則取棧頂元素並進行出棧操作,訪問該棧頂結點,然後將當前的P置為棧頂結點的右孩子;
3)直到P為NULL並且棧為空則遍歷結束
void inOrder2(BinTree *root) //非遞迴中序遍歷 { stack<BinTree*> s; BinTree *p=root; while(p!=NULL||!s.empty()) { while(p!=NULL) { s.push(p); p=p->lchild; } if(!s.empty()) { p=s.top(); cout<<p->data<<" "; s.pop(); p=p->rchild; } } }