数据结构—【二叉树(深度优先遍历)】重难点
关注我
重点:
使用栈的遍历算法思想
非递归算法的实现
难点:
非递归算法的实现及栈的思想
1. 先序遍历
void preorderNonrecursion(BTNode *bt)
{
if(bt != NULL)
{
// 定义一个栈
BTNode *Stack[MaxSize];
// 指针设为-1,第一个元素在0处
int top = -1;
// 再设一个结点p
BTNode *p;
// 将根节点入栈
Stack[++top] = bt;
// 孩子不空则进行入栈和出栈
while(top!=-1)
{
// 将根节点出栈
p = Stack[top--];
// 访问根节点,相当于输出
Visit(p);
// 先放右孩子,再放左孩子,访问的顺序就为左孩子,右孩子,符合先序遍历。
if(p -> rchild != NULL )
Stack[++top] = p ->rchild;
if(p -> lchild != NULL )
Stack[++top] = p ->lchild;
}
}
}
2. 中序遍历
void inorderNonrecursion(BTNode *bt)
{
if(bt != NULL)
{
// 定义一个栈
BTNode *Stack[MaxSize];
// 指针设为-1,第一个元素在0处
int top = -1;
// 再设一个结点p
BTNode *p;
p = bt;
while(top!=-1 || p!=NULL)
{
// 找到最左孩子,并将左一侧孩子都入栈
while(p!=NULL)
{
Stack[++top] = p;
p = p -> lchild;
}
if(top!=-1)
{
p = Stack[top--];
Visit(p);
p = p ->rchild;
}
}
}
}
3. 后序遍历
void postorderNonrecursion(BTNode *bt)
{
if(bt != NULL)
{
// 定义两个栈
BTNode *Stack1[MaxSize];
BTNode *Stack2[MaxSize];
// 指针设为-1,第一个元素在0处
int top1 = -1;
int top2 = -1;
// 再设一个结点p
BTNode *p = NULL;
// 将根节点入栈
Stack[++top1] = bt;
// 孩子不空则进行入栈和出栈
while(top1 !=-1)
{
// 这里使用先序遍历入栈1
p = Stack1[top1--];
// 紧接着入栈2
Stack2[++top2] = p;
if(p -> lchild != NULL)
Stack1[++top1] = p ->lchild;
if(p -> rchild != NULL)
Stack1[++top1] = p ->rchild;
}
// 最后全部逆序,出一个,打印一个
while(top2 != -1)
{
p = Stack[top2--];
Visit(p);
}
}
}