作业五 二叉树II

来源:互联网 发布:c语言将大写转换为小写 编辑:程序博客网 时间:2024/06/05 21:50

这一块的题目难度普遍较大,题目也比较经典,做不来的时候可以百度搜索思路,然后自己代码实现



2322 二叉树的创建 III

这题可以用递归来做,代码实现不复杂,重点在于对先序和递归的理解。


附上代码:

BTree creat(){//ABD...C..BTree p = (BTree)malloc(sizeof(BTNode));char tmp;cin >> tmp;if (isalpha(tmp)){p->data = tmp;p->lchild = creat();p->rchild = creat();}else p = NULL;return p;}


2323 2324 叶节点和叶节点数遍历一下就行了,不具体展开



2325 二叉树的树深

  举例:上面ABCD那棵树的树深是3(空节点是不算的),树深需要比较左子树和右子树,取两边更大的一个。

  这题可以用分治的思想,把问题一步步缩小,比如求二叉树T的树深h,就相当于max(T->lchild.h+1,T->rchild.h+1),而T的左子树又可以继续往下分成左子树的左子树和左子树的右子树 ,即T->lchild.h=max(T->lchild->lchild.h+1,T->lchild->rchild.h+1)。然后一步步往下走,直到叶子节点。到来叶子节点左右孩子都是空了怎么办?返回1咯,最后一步步反哺,T.h就出来了。

int GetDepth(BTree root){if (!root) return 0;int i = 0, j = 0;if (root->lchild)i = GetDepth(root->lchild);if (root->rchild)j = GetDepth(root->rchild);return i > j ? i + 1 : j + 1;}



2328 二叉树带节点数输出

水题,输出的时候判断一下是不是空就行了



插句题外话:先中后序遍历刚开始会搞不清,实际上只要知道先中后都是相对于 根节点 就不会弄混了。 先序就是根节点第一个遍历,中序就是根节点第二个遍历,后序就是根节点第三个遍历。确定了根节点,剩下俩个的顺序都是先左后右。(特殊情况下会先右后左,比如下面这道)

2329 二叉树的竖向输出   


问题1.输出要从最右边开始,然后依次向左移动输出

问题2.要记录树深

在之前做遍历输出的时候应该可以发现,中序和后序都会先输出最左边的节点。所以我们在这里做一个变通,把遍历的顺序改为右中左(逆中序),你会发现输出顺序完美符合需求(*^▽^*)

树深可以用之前写过的函数,在遍历输出之前先记录树深;也可以在递归的时候直接记录并输出

void PrintTree(BTree bt, int nLayer){if (!bt ) return;PrintTree(bt->rchild, nLayer + 1);for (int i = 0; i<nLayer; i++)printf("-");printf("%c\n", bt->data);PrintTree(bt->lchild, nLayer + 1);}




2330  二叉树的横向输出                           令人秃头的时刻到了_(:з」∠)_

一行行输出,用层序遍历,这是首先想到的

因为要打‘-’号,所以需要从左往右确认是第几个,接着到了最后一个要换行

而且当一行有多个点时,个个点之间‘-’的数量为相减

问题1.怎么确认是从左往右数的第N个

问题2.怎么分辨该节点在第几行

问题3.当一行有多个输出时,怎么确认还要打几个‘-’号

解决1:左中右 中序遍历一次,给每个节点定位

解决2:可以遍历一次确定各节点深度;也可以在队里直接数个数(例如当第N行遍历之后,一共新加入了X个节点,下一行每pop()一个节点,X--,X==0时换行)

解决3:用tmp临时节点记录上一个节点,中间‘-’的个数为 now.n-tmp.n


2331 二叉树确定

  具体看链接  http://blog.csdn.net/qq_38449464/article/details/78674855

  简单讲,先序提供根节点的信息,中序提供所有节点的排序信息,结合两者确定二叉树。

  如果题目给的是后序和中序,那么就从后序的最右边开始遍历(因为后序的最后一个是根节点,和先序是反的)

  如果题目只给先序和后序,无法确定二叉树。