二叉树是很有用的一种数据结构,遍历则是其基本操作,这里列出实是保证完整性。几个备用的结构定义和函数:
//二叉树节点定义 class TreeNodeElement { public: TreeNodeElement();
TreeNodeElement(int value);
TreeNodeElement(int value,TreeNodeElement* l,TreeNodeElement* r);
~TreeNodeElement();
private: public: int _value;
TreeNodeElement* _l;
TreeNodeElement* _r; };
typedef TreeNodeElement* TreeNode; |
//递归实现(visit) void Visit(TreeNode node) { cout<<node->_value<<" "; } |
二叉树中序遍历的递归和非递归实现:
//递归遍历 void BinRetriveATree(TreeNode root,void (* visit)(TreeNode)) { if (root) { BinRetriveATree(root->_l,visit); (*visit)(root); BinRetriveATree(root->_r,visit); }
} |
//非递归遍历,添加#include <stack> void BinRetriveATreeWithoutRecurve(TreeNode root,void (* visit)(TreeNode)) { stack<TreeNode> tree;
while ((root != NULL) || (!tree.empty())) { while (root != NULL) { tree.push(root);
root = root->_l; }
if (!tree.empty()) { root = tree.top();
tree.pop();
visit(root);
root = root->_r; //转到右子树
} } } |