我是Last炫,后面还有个点啊
你龙哥的一个朋友向我问了这个问题,你龙哥就把解题思路发上来了呀,粘构式们好好看好好学呀
题目描述
编一个程序,读入先序遍历字符串,根据此字符串建立一棵二叉树(以指针方式存储)。
例如如下的先序遍历字符串:
A ST C # # D 10 # G # # F # # #
各结点数据(长度不超过3),用空格分开,其中“#”代表空树。
建立起此二叉树以后,再按要求输出二叉树。
输入
输入由多组测试数据组成。
每组数据包含一行字符串,即二叉树的先序遍历,字符串长度大于0且不超过100。
输出
对于每组数据,显示对应的二叉树,然后再输出一空行。输出形式相当于常规树形左旋90度。见样例。 注意二叉树的每一层缩进为4,每一行行尾没有空格符号。
样例输入
A ST C # # D 10 # G # # F # # # 4 2 1 # # 3 # # 5 # 6 # #
样例输出
A F D G 10 ST C 6 5 4 3 2 1
题目分析
很多粘够使不会做是因为看不懂题目啊,听听你龙哥的分析啊。
你根据先序遍历画一个图,就会发现啊,两个例子的输出是由二叉树的最右边的节点到最左边的啊,题目的输出不就是先序遍历的反过来吗,缩进为4代表每增加1深度就要输出4个空格啊,题目的分析大概就这样啊,你龙哥讲不了更多了。
所以啊,不要被题目里的左旋给吓到了啊,你得学会逆转。
代码
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
typedef string TElemType;
typedef struct BiTNode {
TElemType data;
int depth = 0;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
这是你龙哥定义的代码块啊,用string类型来储存字符串啊,lchild,rchild两个指针分别代表左右孩子指针,depth代表节点深度啊,看不懂的去把二叉树看了再回来看啊。
void CreateBiTree(BiTree &T,int cnt)
{
TElemType ch;
//int cnt;
//int flag = 0;
/*if(flag = 1) {
T->depth++;}*/
if(!(cin >> ch)) exit(0);
if(ch[0] == '#') T = NULL;
else{
T = new BiTNode;
T->data = ch;
cnt++;
T->depth = cnt-1;
CreateBiTree(T->lchild,cnt);
CreateBiTree(T->rchild,cnt);
}
}
这是你龙哥定义的创建二叉树函数啊,cnt用来记录每次递归的深度,递归完成再把深度放进depth里啊,递归看不懂的,到底要我告诉你多少遍?看懂二叉树再来看代码啊。
int InOrderTraverse(BiTree T)
{
if(T){
InOrderTraverse(T->rchild);
for(int i = 0;i<T->depth ;i++){
cout<<" ";
}
cout<<T->data<<"\n";//" "<<T->depth<<"\n";
InOrderTraverse(T->lchild);
}
}
这是定义的遍历函数啊,根据深度来输出空格,缩进为4代表每深入一层就得输出四个空格啊。
void DestroyBitree(BiTree& T)
{
if(T){
if(T->lchild ) DestroyBitree(T->lchild );
if(T->rchild ) DestroyBitree(T->rchild );
free(T);
T = NULL;
}
}
这是你龙哥的销毁函数啊,看不懂的就像那路边的啊。
你龙哥就不放主函数代码了,把这几个函数放进去加一个循环就行了啊。
自己做吧,你龙哥啊,有点累了,下次早点来吧。