1、递归方法
前序遍历
void pre_order_r(const tree_node *root,int (*visit)(const tree_node*))
{
if (root == NULL) return;
visit(root);
pre_order_r(root->left, visit);
pre_order_r(root->right, visit);
}
中序遍历
void in_order_r(const binary_tree_node_t *root,int (*visit)(const binary_tree_node_t*))
{
if(root == NULL) return;
in_order_r(root->left, visit);
visit(root);
in_order_r(root->right, visit);
}
后序遍历
void post_order_r(const binary_tree_node_t *root,int (*visit)(const binary_tree_node_t*))
{
if(root == NULL) return;
post_order_r(root->left, visit);
post_order_r(root->right, visit);
visit(root);
}
2、非递归方法
前序遍历
void pre_order(const binary_tree_node_t *root, int (*visit)(const binary_tree_node_t*))
{
const binary_tree_node_t *p;
stack<const binary_tree_node_t *> s;
p = root;
if(p != NULL) s.push(p);
while(!s.empty())
{
p = s.top();
s.pop();
visit(p);
if(p->right != NULL) s.push(p->right);
if(p->left != NULL) s.push(p->left);
}
}
中序遍历
void in_order(const binary_tree_node_t *root,int (*visit)(const binary_tree_node_t*))
{
const binary_tree_node_t *p;
stack<const binary_tree_node_t *> s;
p = root;
while(!s.empty() || p!=NULL)
{
if(p != NULL)
{
s.push(p);
p = p->left;
}
else
{
p = s.top(); //当一个节点没有左子树,或左子树已被访问时,他才会弹出来被访问。
s.pop();
visit(p);
p = p->right;
}
}
}
后序遍历: 要保证一个节点被访问时,它的左子树和右子树已经在它之前被访问了。
层次遍历:用队列。