记录二叉树的前序,中序,后续,层序等非递归遍历。
1 二叉树非递归前序遍历
用栈实现二叉树非递归前序遍历,按照 V L R顺序进行遍历;每一个都按照V L R方式进行。
上图中,根节点先入栈,出栈并访问根节点,然后依次右孩子入栈,左孩子入栈;
/* 功能:二叉树非递归前序遍历* * 参数:无*/void n_preOrder(){cout << "非递归前序遍历" << endl;if (root_ == nullptr){return;}stack<Node *> s;s.push(root_);while (!s.empty()){Node *top = s.top();s.pop();cout << top->data_ << " "; // 访问v节点if (top->right_ != nullptr) // R {s.push(top->right_);}if (top->left_ != nullptr) // L{s.push(top->left_);}}cout << endl;}
2. 二叉树非递归中序遍历
L V R ,按照L V R方式进行入栈和出栈操作。
/** 功能:二叉树非递归中序遍历** 参数:无*/void n_inOrder1(){cout << "非递归中序遍历:";if (root_ == nullptr){return;}stack<Node *> s;Node *cur = root_;while (cur != nullptr) // 左孩子节点入栈{s.push(cur);cur = cur->left_;}while (!s.empty()){Node *top = s.top();s.pop(); // 取出栈顶元素 , 并打印 cout << top->data_ << " "; cur = top->right_; while (cur != nullptr) // 取出的元素{s.push(cur);cur = cur->left_;}}}
3. 二叉树后续遍历
将二叉树的非递归后续遍历顺序,由L R V 转为 V R L 。这样用两个栈实现,一个栈用来存放遍历的中间节点,另一个栈存放访问的节点。
void n_postOrder(){cout << "非递归后续遍历:" ;stack<Node *> s1;stack<Node *> s2;s1.push(root_);while (!s1.empty()){Node *top = s1.top();s1.pop();s2.push(top);if (top->left_ != nullptr){s1.push(top->left_);}if (top->right_ != nullptr){s1.push(top->right_);}}while (!s2.empty()){cout << s2.top()->data_ << " ";s2.pop();}cout << endl;}
4. 二叉树非递归层次遍历
在解决一些遍历的问题时,深度遍历用栈实现;广度遍历用队列实现。
所以,层次遍历用队列实现。
void n_levelOrder(){cout << "非递归 层序遍历";if (root_ == nullptr){return;}queue<Node *> que;que.push(root_);while (!que.empty()){Node *front = que.front();que.pop();cout << front->data_ << " ";if (front->left_ != nullptr){que.push(front->left_);}if (front->right_ != nullptr){que.push(front->right_);}}cout << endl;}