二叉树

嘿嘿,下午学一学二叉树

1、已知非空二叉树采用广义表形式作为输入,请写一算法,建立该二叉树的二叉链表存储结构。

算法思想:

BBtree creat()

{

BBtree head = NULL;

char c;

int flag;

BBtree a[100];

int top = -1;

BBtree p;

while (1)

{

scanf_s("%c", &c);

switch (c)

{

case '@':

return head;

case '(':

flag = 1; break;

case ',':

flag = 2;

case ')':

top--; break;

default:

p = (BBtree)malloc(sizeof(Btree));

p->elem = c;

p->lchild = NULL;

p->rchild = NULL;

if (head == NULL)

{

head = p;

a[++top] = p;

}

else

{

if (flag == 1)

{

a[top]->lchild = p;

a[++top] = p;

}

else if(flag==2)

{

a[top]->rchild = p;

a[++top] = p;

}

}

break;

}

}

}


这是按照前序来输出的。

2、已知非空二叉树采用顺序存储结构,结点的数据信息依次存放于数组BT[0...Max-1]中(若元素值为0,表示该元素对应的结点在二叉树中不存在)。写出生成该二叉树的二叉链表结构的算法。

如前序:【A,B,C,D,E,F,G】

错误点:

else

{

j = (i - 1) / 2;

if (j - (i - 1) / 2 == 0)

b[j]->lchild = p;

else

b[j]->rchild = p;

}

(i - 1) / 2 会取整,肯定肯定等于j

正解:

BBtree build(char a[])

{

BBtree head = NULL,p,b[7];

int i = 0, j = 0;

for (i = 0; i < 7; i++)

{

p = (BBtree)malloc(sizeof(Btree));

p->elem = a[i];

p->lchild = NULL;

p->rchild = NULL;

b[i] = p;

if (head == NULL)

head = p;

else

{

j = (i - 1) / 2;

if (i-2*j-1 == 0)

b[j]->lchild = p;

else

b[j]->rchild = p;

}

}

return head;

}


一会儿再来写注释

3、已知二叉树采用二叉链表存储结构,根节点所在的地址为T,写一递归算法,求该二叉树中叶子结点的个数。

错误❌算法:

int countleaves(BBtree t,int count)

{

int i = 0;

if (t != NULL)

{

if (t->lchild == NULL && t->rchild == NULL)

{

count++;

printf_s("叶子节点有%d个\n", count);

}

i = countleaves(t->lchild,count);

i = countleaves(t->rchild,count);

}

return count;

}


因为count应该求最里面的,这样的话就是求最外面的

✔正确算法:

int countleaf(BBtree t)

{

if (t == NULL)

return 0;

if (t->lchild == NULL && t->rchild == NULL)

return 1;

return countleaf(t->lchild) + countleaf(t->rchild);

}


这个跟上一章的一个题还有点相似,这种类型的题就是我的弱点。

4、已知二叉树采用二叉链表存储结构,根节点所在的地址为T,写一递归算法,求该二叉树的深度。

int deep(BBtree t)

{

int left, right;          //left和 right分别记录左右子树的深度

if (t == NULL)            //若为当前为叶子结点,深度为0

return 0;

else

{

left = deep(t->lchild);    //计算左子树深度

right = deep(t->rchild);  //计算右子树深度

if (left > right)

return left + 1;      //比较2个深度,取大的那个

else

return right + 1;    //有条件的返回

}

}


5、前序后序中序递归和非递归遍历

递归:

前序:

void qian(BBtree t)

{

if (t != NULL)

{

printf_s("%c", t->elem);

qian(t->lchild);

qian(t->rchild);

}

}

中序:

void 中(BBtree t)

{

if (t != NULL)

{

中(t->lchild);

printf_s("%c", t->elem);

中(t->rchild);

}

}

后序:

void 后(BBtree t)

{

if (t != NULL)

{

后(t->lchild);

后(t->rchild);

printf_s("%c", t->elem);

}

}

非递归:

前序:

void qian2(bbtree t)

{

bbtree a[10];

bbtree p;

int top = -1;

a[++top] = t;

while (top != -1)

{    

p = a[top--];

while (p != NULL)

{

if (p->rchild != NULL)

a[++top] = p->rchild;

printf_s("%c", p->elem);

p = p->lchild;

}

}

}


你可能感兴趣的:(二叉树)