二叉树后根次序遍历(迭代法)
文章目录
前言
学校数据结构与算法中的实验题分享,记录生活OvO!
提示:以下是本篇文章正文内容,下面案例可供参考
代码如下:
template <class T>
void BinaryTree<T>::postOrderTraverse() { //左右根
cout << "后根次序遍历: ";
LinkedStack<TreeNode<T>*>stack;
TreeNode<T>* p = this->root;
TreeNode<T>* q = NULL; //标记节点
while (!stack.empty() ||p != NULL) {
while (p != NULL) { //所有左子孩子入栈
stack.push(p);
p = p->left;
}
p = stack.pop();//弹栈
if (p->right == NULL || p->right == q) { //右孩子不存在或者右孩子已经访问过
cout << p->data << " ";
q = p; //记录该节点
p = NULL; //避免开头再次将左孩子入栈
}
else { //右孩子没被访问过
stack.push(p); //p节点再次入栈
p = p->right;
}
}
cout << endl;
}
总结
利用栈的思想,首先将root及他的所有左孩子节点入栈,然后依次弹栈,此时需要做一个判断,判断该节点的右孩子rightChild是否刚被输出过,如果被输出过,则输出当前节点,并将指针指向NULL,防止进入开头的while操作。进入下一次弹栈。反之如果该节点rightChild存在并且没有被输出过,则将当前结点再次压栈,并将指针指向该节点的rightChild,那么再一次进入循环时,会将这个rightChild节点作为根,进行左孩子压栈(开头的while循环),然后重复操作。就实现了二叉树的后根迭代遍历啦!