|
发表于 2014-5-25 20:16:05
|
显示全部楼层
(*p)->lchild = T; //p是指针的指针
pre = *p; //pre是指针
InThreading(T); //调用这个函数,你注释的是中序遍历线索化
pre->rchild = *p; //做孩子赋值为一个指针。。。*p
pre->rtag = Thread; //rtag 标记为Thread
(*p)->rchild = pre;//*p的右孩子为pre.......
给你个解释吧!希望你能明白,首先你得知道*p(注意这里是个二级指针,蛋疼的很)表示什么,它表示我们第一次创建的pre,就是用malloc动态分配了个堆给他,然后*p指向这个新分配的内存,第一点你要明白的是*p它只是赋值给pre,在整个函数期间这个*p一直没变,始终指向那个新分配的内存,第二点,pre =* p;就是把pre的值指向了新分配的内存,而这个pre在函数InThreading(T)被修改,在函数InThreading(T)调用完后,pre指向了树最右边的最后一个节点了。而这时*p还是指向新分配的内存。 pre->rchild = *p,这句表示把树右边的最后一个节点右孩子指向那个新分配的内存(节点),当然还要把最后这个节点的rtag标志改为线索化。最后指向新内存的(*P)的右孩子就要指向树的最后那个节点,这样就形成了一个回路,有点类似循环链表,我已经说得很详细了。:lol: |
|