由于递归时通过栈来实现的,虽然递归代码有时候看起来比较简单,然后递归太深就会造
成栈溢出。所以我们可以通过栈来实现二叉树的非递归遍历。下边看解析:
【先序遍历】
下边看实现代码:
void PreOrderTraverseNonR() { stack<Node*> s; Node* cur = _root; if (cur == NULL) return; while (cur || !s.empty()) { while (cur) { cout << cur->_data << " "; s.push(cur); cur = cur->_left; } Node* top = s.top(); s.pop(); cur = top->_right; } cout << endl; }
【中序遍历】
下边给出实现代码:<注明:图片中那是中序遍历,打错了>
<pre name="code" class="cpp">void InOrderTraverseNonR() { stack<Node*> s; Node* cur = _root; if (cur == NULL) return; while (cur || !s.empty()) { while (cur) { s.push(cur); cur = cur->_left; } Node* top = s.top(); cout << top->_data<<" "; s.pop(); cur = top->_right; } cout << endl; }
【后序遍历】
下边看代码:
void PostOrderTraverseNonR() { if (NULL == _root) return; Node* prev = NULL; Node* cur = _root; stack<Node*> s; while (cur || !s.empty()) { while (cur) { s.push(cur); cur = cur->_left; } Node* top = s.top(); if (top->_right == NULL || top->_right == prev) { cout << top->_data << " "; prev = top; s.pop(); } else { cur = top->_right; } } cout << endl; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。