可能很多人都为二叉树的创建,遍历的三种顺序而烦恼,这里说一说个人的小套路以助你理解。
首先来看创建:
void CreateBTree(BTreeLink *&B)
{
char ch = getchar();
if (ch == ' ')
{
B = NULL; //表示为空指针域
}
else
{
B = (BTreeLink *)malloc(sizeof(BTreeLink));
printf("address is %d\n",B);
B->next = NULL;
B->data = ch;
CreateBTree(B->LChild);
CreateBTree(B->RChild);
}
}
这里一看就是先序创建的,为什么呢?因为B->data = ch;在创建左右树之前。
在看一下遍历:
void InorderTraversalBTree(BTreeLink *B)
{
if (B != NULL)
{
InorderTraversalBTree(B->LChild);
printf("%c ", B->data);
InorderTraversalBTree(B->RChild);
}
}
这里一看就是中序遍历,因为输出在遍历左右树之间。
从上可以隐隐感受到某操作在递归之上就是先序,在递归之间就是中序,在递归之后就是后序,这点可以很好的帮助以后解决相关问题。
比如在节点中新加一个指针,指向后序遍历时,这个节点的后一个。
这里一看到后序,第一感受就是这个操作在递归之后,确实如此。
代码如下:
void CreateBehindNext(Node * node){
if (node){
CreateBehindNext(node->LChild);
CreateBehindNext(node->RChild);
if (pre){
pre->next = node;
printf("create next pre is %d this is %d\n", pre, node);
}
pre = node;
}
}
如有错误还请提出。