赞
踩
用二叉链表的左子树指向该节点最左边的孩子,右子树指向该节点的兄弟,以达到存树的目的
储存结构
typedef struct Node {
int data;
struct Node* firstchild;
struct Node* nextbro;
}Tree;
建树的方式跟二叉树基本是相同的
Tree* creatTree() { Tree* T; char data; data = getchar(); if (data == '#') { T = NULL; } else { T = (Tree*)malloc(sizeof(Tree)); T->data = data; T->firstchild = creatTree(); T->nextbro = creatTree(); } return T; }
例如,
A结点的左边第一个孩子是B,A没有兄弟,那么 A→firstchild = B; A→nextbro = NULL; B 的孩子为E,兄弟为C、D,那么 B的firstchild指向E节点,B的nextbro指向C 结点, C 的孩子为G,兄弟为D C→firstchild = G,C→bextbro = D; D 没有孩子也没有兄弟, D→firstchild = NULL.D→nextbro = NULL; E 的孩子为K,没有兄弟 E→firstchild = K,E→nextbro = NULL; G没有孩子也没有兄弟, G→firstchild = NULL,G→nextbro = NULL;
因此,此树在二叉链表中的结构表示为
二叉链表只是用来存储这棵树,但是此树的叶子结点或者度等还是看原来树的结构
一棵树采用孩子兄弟表示法存储,每个结点的值为一个字母,
要求:
(1)编写算法,输入该树对应的二叉树的先序序列建立二叉链表;
(2)统计并输出该树的叶子结点数。
(3)输出根结点的度。(注意:不是树的度)
该树对应的二叉树的先序序列,空指针位置输入#
叶子点树和根结点的度,以空格分隔。
AB#CD##E###
3 3
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef struct Node { int data; struct Node* firstchild; struct Node* nextbro; }Tree; Tree* creatTree() { Tree* T; char data; data = getchar(); if (data == '#') { T = NULL; } else { T = (Tree*)malloc(sizeof(Tree)); T->data = data; T->firstchild = creatTree(); T->nextbro = creatTree(); } return T; } void preOrder(Tree* T,int *n0) { if (T != NULL) {if (T->firstchild == NULL) { *n0 = *n0 + 1; } preOrder(T->firstchild, n0); preOrder(T->nextbro, n0); } } void root(Tree* T,int *n) { if (T!= NULL) { *n = *n+1; root(T->nextbro,n); } } int main() { Tree *T; int n0 = 0, n1 = 0, n2 = 0; T = creatTree(); preOrder(T, &n0); printf("%d ", n0); int n = 0; root(T->firstchild, &n); printf("%d", n); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。