看了一些关于二叉树遍历算法的文章,例如:
回忆了一下二叉树的遍历思路,然后用递归的方式来写三种遍历算法,都非常简单,但是使用非递归方式来写三种遍历算法就有点绕了。所以总结了一下比较简单并且逻辑清晰的遍历算法。
二叉树的基本结构
//头文件 #include#include#include//非递归方式用到了栈 //二叉树基本结构 struct BTree{ std::string value; BTree* leftChild; BTree* rightChild; BTree(const std::string &val, BTree* left = NULL, BTree* right = NULL) { value = val; leftChild = left; rightChild = right; } };
先序(先根)遍历算法
遍历顺序:根节点 - 左子节点 - 右子节点
这里也可以写作:根节点 - 右子节点 - 左子节点。
因为对于二叉树(非排序二叉树)来说,先遍历左节点还是右节点实际上是一样的,在算法上也只是交换一下所指元素的区别。
先序、中序、后序遍历算法中的顺序,实际上是指的访问根节点的顺序。
递归实现思路:先处理当前节点的值,然后将左子节点递归处理,最后将右子节点递归处理。
//先序遍历(递归) void pre_visit_recursive(BTree* root) { if(root) { std::cout