对于二叉树,原来始终不明白用递归前序创建,前序遍历究竟是怎么回事,今天晚上好好琢磨了下。
两种不同的方法:
1、可以考虑把递归调用的函数考虑为调用不同的函数,方便分析。
2,如果考虑为调用同一个函数时,递归是用栈来实现的,用栈来分析的话就比较方便。
对于如图所示的一个二叉树,前序创建时的代码为:
/**
* @brief 递归前序创建二叉树
* @attention 按前序输入二叉树中结点的值,#表示空树,构造二叉链表表示二叉树T
*/
int preCreateBiTree(BiTNode *&T)
{
char ch;
scanf("%c", &ch);
if ( ch == '#' )
T = NULL;
else {
T = (BiTNode *)malloc(sizeof(BiTNode));
T->data = ch;
preCreateBiTree(T->lchild);
preCreateBiTree(T->rchild);
}
}
我们键盘输入为字符串"ABD###CF##G##"。
用第一种方法分析时:
用第二种方法分析时:创建左子树递归调用preCreateBiTree(T->lchild)时,依次入栈为A、B、D,然后依次D、B、A出栈。