第六章 树和二叉树
int Is_Descendant_C(int u,int v)
int Bitree_Sim(Bitree B1,Bitree B2)次根据栈顶元素的mark域值决定做何种动作.
typedef struct {
                    int data;
                    EBTNode *lchild;
                    EBTNode *rchild;
                    EBTNode *parent;
                    enum {0,1,2} mark;
                  } EBTNode,EBitree;
typedef struct {
                    int data;
                    PBTNode *lchild;
                    PBTNode *rchild;
                    PBTNode *parent;
                  } PBTNode,PBitree; .
  scanf("%d",&k);
  c=0; .
}
void LayerOrder(Bitree T)相比,作了一个修改,不管当前结点是否有左右孩子,都入队列.这样
当树为完全二叉树时,遍历时得到是一个连续的不包含空指针的序列.反之,则序列中会含有空指针.
Status CreateBitree_Triplet(Bitree &T)意:为了能用一个统一的公式计算子孙数目,所以当T为空指针时,要返回-1而不是0.
BTNode *PreOrder_Next(BTNode *p)不是哪儿理解错了
Bitree PostOrder_Next(Bitree p)irstchild) return 1;
  for(sd=1,p=[T].firstchild;p;p=p->next)
    if((d=SubDepth(p->child))>sd) sd=d;
  return sd+1;
}arent) dep++; .
  Build_Sub(1,n,1,n); .
}
分析:本算法利用了这样一个性质,即一棵子树在前序和中序序列中所占的位置总是连续的.因此,就可以用起始下标和终止下标来确定一棵子树.Pre_Start,Pre_End,In_Start和In_End分别指示子树在前序子序列里的起始下标,终止下标,和在中序子序列里的起始和终止下标.
typedef struct{
                    CSNode *ptr;
                    CSNode *lastchild;
                  } NodeMsg; tr=(CSNode*)malloc(sizeof(CSNode));
    Tree[i].ptr->data=[i].data; arent>=0) arent; astchild)) tr->firstchild=Tree[i].ptr; astchild->nextsib=Tree[i].ptr; astchild=Tree[i].ptr; tr=(CSNode*)malloc(sizeof(CSNode));
  Tree[0].data=c;
  Tree[0].ptr->data=c;
  while((p=getchar())!='^'&&(c=getchar())!='^')
  {
    Tree[n].ptr=(CSNode*)malloc(sizeof(CSNode));
    Tree[n].data=c;
    Tree[n].ptr->data=c;
    for(k=0;Tree[k].data!=p;k++); ata!=p) return ERROR; tr;
    if(!r->firstchild)
      r->firstchild=Tree[n].ptr;
    else Tree[k].lastchild->nextsib=Tree[n].ptr;
二叉树公式
    Tree[k].lastchild=Tree[n].ptr;
Status CreateBiTree_GList(BiTree &T)ata); irstchild;p;p=p->next)
    Print_CSTree(p->child,i+1); .
  Print_CTree,0); .
}算法另一个改进之处在于加入了广义表格式是否合法的判断.
void PrintGlist_CSTree(CSTree T)ata=c;
  i=pos++; irstchild=p;
    p->child=pos; irtchild=NULL;
void PrintGList_CTree(CTree T,int i)ata);
  if[i].firstchild) //非叶结点
  {
    printf("(");
    for(p=T->firstchild;p;p=p->nextsib)
    {
      PrintGlist_CSTree(T,p->child);
      if(p->nextsib) printf(","); //最后一个孩子后面不需要加逗号
    }
    printf(")");
  }//if
}//PrintGlist_CTree

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。