回 帖 发 新 帖 刷新版面

主题:[讨论]有精通数据结构的吗??菜鸟请教啊!在线等了好久

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct bitnode
{
    char data;
    int ltag,rtag;
    struct bitnode *lchild,*rchild;
}bitnode;

bitnode *creat_tree(bitnode *root)
{
    char ch;
    scanf("%d",&ch);
    if(ch==' ') root=NULL;
    else
    {
        root=(bitnode *)malloc(sizeof(bitnode));
        root->data=ch;
        creat_tree(root->lchild);//为什么要写成root->lchild=creat_tree(root->lchild)??不这样写就错了
        creat_tree(root->rchild);//同问
     }
     return(root);
}




已经建立了二叉树,下面将二叉树线索化,p是树的根结点,最后返回p,和头结点相连

bitnode *inthreading(bitnode *p)
{
        if(p)
        {
            inthreading(p->lchild);//这样写运行时居然没有错?(没有写p->lchild=inthreading(p->lchild))
            if(!p->lchild)
            {
                p->ltag=thread;
                p->lchild=pre;
            }
            if(!pre->rchild)
            {
                pre->rtag=thread;
                pre->rchild=p;
            }
            pre=p;
            inthreading(p->rchild);
        }
    return p;
}




问题在程序中,主要不明白是如何递归的。

回复列表 (共2个回复)

沙发


Tags: [url=http://www.airssjordanshoes.com]  Jordan shoes [/url],
[url=http://www.airssjordanshoes.com] Nike Jordan shoes [/url]
[url=http://www.airssjordanshoes.com]Air  Jordan  [/url]
[url=http://www.airssjordanshoes.com]Michael  Jordan shoes [/url]

板凳

 [quote]
 问题在程序中,主要不明白是如何递归的。
[/quote]
  其实就个人而言,并不是很喜欢用递归(C语言代码中)。模仿递归函数调用的原理,自己写组织一个栈结构,完全可以把递归转换为迭代。不过递归的代码简洁,容易理解。
  掌握递归也不难,所有的递归都有2个关键的地方:递推 和 回归.(这2个部分要分开考虑)
只要把这2步弄懂了,普通的递归很容易理解的。什么时候递推,什么时候回归。在递推 到 回归 之间又做了些什么。我举个例子吧:用递归逆序打印一个字符串: [code=c]
void fun(char *s)
{
if (*s) fun(s+1);
putchar(*s);
}

[/code]
下面考虑char *s="123";fun(s);
 
    [color=00FF00]从这里进入fun函数
           ↓      [/color]      [color=FF0000]↑先putchar('1'),就退出fun函数了[/color]
  fun(s) 当前s指向字符'1'
       [color=00FF00]递推↓[/color]            [color=FF0000]↑先putchar('2'),就回归了[/color]
        fun(s) 当前s指向字符'2'
           [color=00FF00]递推↓[/color]            [color=FF0000]↑先putchar('3'),就回归了[/color]
            fun(s) 当前s指向字符'3'
                [color=00FF00]递推↓ [/color]         [color=FF0000]↑先putchar('\0'),就回归了[/color]  
                fun(s) 当前s指向字符'\0'
         (由于fun函数能递推的条件是*s不等于0,所以现在不能再递推了,要回归了)


按照上面的步骤,很容易出fun函数是逆序输出字符。


[quote]
creat_tree(root->lchild);//为什么要写成root->lchild=creat_tree(root->lchild)??不这样写就错了
creat_tree(root->rchild);//同问[/quote]

对于这里,我想应该是和递归无关把,楼主您再好好想一下C语言函数参数传递机制吧,其实指针类型和整数类型是一样的,并没有太大区别。






我来回复

您尚未登录,请登录后再回复。点此登录或注册