遍历一棵二叉树常用的有四种方法,前序(PreOrder)、中序(InOrder)、后序(PastOrder)还有层序(LevelOrder)。
前中后序三种遍历方式都是以根节点相对于它的左右孩子的访问顺序定义的。例如根->左->右便是前序遍历,左->根->右便是中序遍历,左->右->根便是后序遍历。
而层序遍历是一层一层来遍历的。
二叉树的中序和后序遍历的非递归实现
先序遍历:
先序遍历时,每当我们压入一个结点,我们压入结点前对其进行访问。
void preOrder(TreeNode* pRoot, int k) { stack<TreeNode*> S; TreeNode* cur = pRoot; while(cur || !S.empty()){ while(cur){ S.push(cur); cout << cur->value << " "; cur = cur->left; } // 访问根节点 cur = S.top(); S.pop(); cur = cur.right; } }
中序遍历:
中序时我们需要在遍历完左子树后访问根节点,再去遍历右子树,因此我们仅需依照先序遍历修改部分代码。
// 中序遍历 // 如果存在左子树不断压栈,遍历根节点,遍历右子树 void inOrder(TreeNode* pRoot, int k) { stack<TreeNode*> S; TreeNode* cur = pRoot; while(cur || !S.empty()){ while(cur){ S.push(cur); cur = cur->left; } // 访问根节点 cur = S.top(); S.pop(); cout << cur->value << " "; cur = cur.right; } }