递归遍历
前序
//前序遍历
void PreOrder(BTnode *pnode)
{
if (pnode)
{
visit(pnode);
PreOrder(bnode->left);
PreOrder(bnode->right);
}
}
中序
//中序遍历
void InOrder(BTnode *pnode)
{
if (pnode)
{
InOrder(pnode->left);
递归遍历 visit(pnode);
InOrder(pnode->right);
}
}
后序
//后序遍历
void PostOrder(BTnode *pnode)
{
if (pnode)
{
PostOrder(pnode->left);
PostOrder(pnode->right);
visit(pnode);
}
}
非递归遍历
前序
先访问根节点,再将其入栈,以便之后返回,就这样一直遍历到左子树最下面,然后出栈,进入右子树,继续开始遍历。
//前序遍历
void PreOrder1(BTnode *pnode)
{
stack<*BTnode> s;
BTnode *p = pnode;
while (p || !s.empty())
{
while (p)
{
visit(p); //先访问根节点,再入栈
s.push(p);
p = p->left; //遍历到左子树最下面
}
if (!s.empty())
{
p = s.top();
s.pop();
p = p->right; //进入右子树,开始新的遍历
}
}
}
void PreOrder2(BTnode *pnode)
{
stack<*BTnode> s;
BTnode *p = pnode;
while (p || !s.empty())
{
if (p)
{
visit(p);
s.push(p);
p = p->left;
}
else
{
p = s.top();
s.pop();
p = p->right;
}
}
}
void PreOrder3(BTnode *pnode)
{
stack < *BTnod入栈
BTnode *p = pnode;
while (p || !s.empty())
{
visit(p);
if (p->right)
s.push(p->right);
if (p->left)
s.push(p->left);
else
{
p = s.top();
s.pop();
p = p->right; //左子树访问完了,访问右子树
}
}
}
中序
//中序遍历
void InOrder1(BTnode *pnode)
{
stack<*Bnode> s;
BTnode *p = pnode;
while (p || !s.empty())
{
//先找到左子树的最下边的节点
while (!p)
{
s.push(p); //边遍历边保存根节点到栈中
p = p->left;
}
//p为空时,说明已经到达左子树最下边,这时需要出栈
if (!s.empty())
{
p = s.top();
visit(p);
s.pop();
p = p->right; //进入右子树,开始新的一轮左子树遍历
}
}
}
vodi InOrder2(BTnode *pnode)
{
stack<*BTnode> s;
BTnode *p = pnode;
while (p || !s.empty())
{
if (p)
{
s.push(p);
p = p->left;
}
else
{
p = s.top();
s.pop();
visit(p);
p = p->right;
}
}
}