二叉树后序遍历

xiaoxiao2021-02-28  102

递归版本:

void _PostOrderR(Node<T>* pRoot) { //递归出口 if (NULL == pRoot) return; //遍历左子树 _PostOrderR(pRoot->LC); //遍历右子树 _PostOrderR(pRoot->RC); cout << pRoot->data << " "; }

非递归版本:

void _PostOrderNor2(Node* pRoot) { if (NULL == pRoot) return; stack<Node<T>*> s;//利用栈结构进行辅助 Node *pCur = pRoot; Node *prev = NULL; Node *pTop = NULL; while (!s.empty() || pCur) { //进行遍历,一直保存左结点 while (pCur) { s.push(pCur); //左结点存在,将左结点入栈 pCur = pCur->LC; } pTop = s.top(); //如果栈顶元素不存在右节点,或者它的右节点已经被访问,那么对该结点进行访问,并将该节点出栈 if (NULL == pTop->RC || pTop->RC == prev) { cout << pTop->data << " "; prev = pTop; s.pop(); } //如果存在右节点,或者右节点没有被访问,那么以该节点为根进行遍历保存左结点 else pCur = pTop->RC; } cout << endl; }

例图:

转载请注明原文地址: https://www.6miu.com/read-43725.html

最新回复(0)